mirror of https://github.com/ehang-io/nps
Jules was unable to complete the task in time. Please review the work done so far and provide feedback for Jules to continue.
parent
ab648d6f0c
commit
6af4ca6377
|
@ -0,0 +1,77 @@
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Nps.Core.Config;
|
||||||
|
|
||||||
|
namespace Nps.Client
|
||||||
|
{
|
||||||
|
public class ClientService : IHostedService
|
||||||
|
{
|
||||||
|
private readonly NpcClientConfig _config;
|
||||||
|
private readonly ILogger<ClientService> _logger;
|
||||||
|
private CancellationTokenSource? _internalCts;
|
||||||
|
|
||||||
|
public ClientService(NpcClientConfig config, ILogger<ClientService> logger)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("NPC Client service starting...");
|
||||||
|
_logger.LogInformation("Server Address: {ServerAddr}, VKey: {Vkey}", _config.Common?.ServerAddr, _config.Common?.Vkey);
|
||||||
|
|
||||||
|
if (_config.Tunnels != null)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Configured tunnels: {TunnelCount}", _config.Tunnels.Count);
|
||||||
|
foreach(var tunnel in _config.Tunnels)
|
||||||
|
{
|
||||||
|
_logger.LogDebug(" Tunnel: Mode={Mode}, ServerPort={ServerPort}, Target={TargetAddr}", tunnel.Mode, tunnel.ServerPort, tunnel.TargetAddr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_internalCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
|
||||||
|
|
||||||
|
// Placeholder for actual client connection logic loop
|
||||||
|
// For example, you might start a manager here that handles multiple tunnel connections
|
||||||
|
// Task.Run(async () => await ConnectAndManageTunnelsAsync(_internalCts.Token), _internalCts.Token);
|
||||||
|
_logger.LogInformation("Client service main logic placeholder started. (Actual tunnel connections not yet implemented).");
|
||||||
|
|
||||||
|
|
||||||
|
if (_config.Common?.AutoReconnection == true)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Auto-reconnection is enabled.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("NPC Client service stopping...");
|
||||||
|
if(_internalCts != null && !_internalCts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
_internalCts.Cancel();
|
||||||
|
}
|
||||||
|
// Placeholder for actual disconnection logic
|
||||||
|
_logger.LogInformation("Client service cleanup placeholder. (Actual tunnel disconnections not yet implemented).");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example of a method that would contain the core client logic
|
||||||
|
// private async Task ConnectAndManageTunnelsAsync(CancellationToken cancellationToken)
|
||||||
|
// {
|
||||||
|
// while(!cancellationToken.IsCancellationRequested)
|
||||||
|
// {
|
||||||
|
// _logger.LogDebug("Client management loop running...");
|
||||||
|
// // Connect to server
|
||||||
|
// // For each tunnel in config, establish connection
|
||||||
|
// // Handle reconnections if AutoReconnection is true
|
||||||
|
// await Task.Delay(5000, cancellationToken); // Example delay
|
||||||
|
// }
|
||||||
|
// _logger.LogInformation("Client management loop stopped.");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Nps.Core\Nps.Core.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,135 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Nps.Core.Config;
|
||||||
|
|
||||||
|
namespace Nps.Client
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static async Task Main(string[] args)
|
||||||
|
{
|
||||||
|
var loggerForPreHost = CreatePreHostLogger();
|
||||||
|
|
||||||
|
if (args.Length > 0 && HandleServiceCommands(args, loggerForPreHost))
|
||||||
|
{
|
||||||
|
return; // Command was handled, exit
|
||||||
|
}
|
||||||
|
|
||||||
|
var hostBuilder = Host.CreateDefaultBuilder(args)
|
||||||
|
.ConfigureAppConfiguration((hostingContext, config) =>
|
||||||
|
{
|
||||||
|
config.SetBasePath(Directory.GetCurrentDirectory())
|
||||||
|
.AddJsonFile("appsettings.npc.json", optional: false, reloadOnChange: true)
|
||||||
|
.AddEnvironmentVariables()
|
||||||
|
.AddCommandLine(args);
|
||||||
|
})
|
||||||
|
.ConfigureLogging((hostingContext, logging) =>
|
||||||
|
{
|
||||||
|
// Configure logging from appsettings.json
|
||||||
|
// For client, might want to add a default "Logging" section to appsettings.npc.json
|
||||||
|
// similar to Nps.Server if not already present, or set defaults here.
|
||||||
|
var loggingConfiguration = hostingContext.Configuration.GetSection("Logging");
|
||||||
|
if (!loggingConfiguration.Exists()) // Check if Logging section exists
|
||||||
|
{
|
||||||
|
// Apply some defaults if no configuration is found
|
||||||
|
logging.AddSimpleConsole(options =>
|
||||||
|
{
|
||||||
|
options.TimestampFormat = "HH:mm:ss ";
|
||||||
|
options.SingleLine = true;
|
||||||
|
});
|
||||||
|
logging.SetMinimumLevel(LogLevel.Information); // Default to Information if not set
|
||||||
|
loggerForPreHost.LogWarning("No 'Logging' section found in appsettings.npc.json. Applying default simple console logger with Information level.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
|
||||||
|
logging.AddConsole();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.ConfigureServices((hostContext, services) =>
|
||||||
|
{
|
||||||
|
var clientConfig = new NpcClientConfig();
|
||||||
|
hostContext.Configuration.Bind(clientConfig);
|
||||||
|
services.AddSingleton(clientConfig);
|
||||||
|
|
||||||
|
services.AddHostedService<ClientService>();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
|
{
|
||||||
|
hostBuilder.UseWindowsService(options =>
|
||||||
|
{
|
||||||
|
options.ServiceName = "NPC .NET Client";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||||
|
{
|
||||||
|
hostBuilder.UseSystemd();
|
||||||
|
}
|
||||||
|
|
||||||
|
var host = hostBuilder.Build();
|
||||||
|
var mainLogger = host.Services.GetRequiredService<ILogger<Program>>();
|
||||||
|
|
||||||
|
LogEffectiveConfig(mainLogger, host.Services.GetRequiredService<NpcClientConfig>());
|
||||||
|
mainLogger.LogInformation("Attempting to run as a service/daemon if not manually started or service command was issued.");
|
||||||
|
|
||||||
|
await host.RunAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool HandleServiceCommands(string[] args, ILogger<Program> logger)
|
||||||
|
{
|
||||||
|
if (args.Contains("install", StringComparer.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
logger.LogInformation("Service install command received. (Note: Actual installation not yet implemented.)");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (args.Contains("uninstall", StringComparer.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
logger.LogInformation("Service uninstall command received. (Note: Actual uninstallation not yet implemented.)");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ILogger<Program> CreatePreHostLogger()
|
||||||
|
{
|
||||||
|
return LoggerFactory.Create(builder =>
|
||||||
|
{
|
||||||
|
builder.AddConsole().SetMinimumLevel(LogLevel.Information);
|
||||||
|
}).CreateLogger<Program>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LogEffectiveConfig(ILogger<Program> logger, NpcClientConfig clientConfig)
|
||||||
|
{
|
||||||
|
logger.LogInformation("NPC Client starting with effective configuration...");
|
||||||
|
if (clientConfig.Common != null)
|
||||||
|
{
|
||||||
|
logger.LogInformation("Common - ServerAddr: {ServerAddr}", clientConfig.Common.ServerAddr);
|
||||||
|
logger.LogInformation("Common - VKey: {Vkey}", clientConfig.Common.Vkey);
|
||||||
|
logger.LogInformation("Common - ConnType: {ConnType}", clientConfig.Common.ConnType);
|
||||||
|
logger.LogInformation("Common - AutoReconnection: {AutoReconnection}", clientConfig.Common.AutoReconnection);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogWarning("Common configuration section is missing!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clientConfig.Tunnels != null && clientConfig.Tunnels.Any())
|
||||||
|
{
|
||||||
|
logger.LogInformation("Tunnels configured: {TunnelCount}", clientConfig.Tunnels.Count);
|
||||||
|
// Optionally log details for each tunnel if desired, respecting log levels
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogInformation("No tunnels configured.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
{
|
||||||
|
"Common": {
|
||||||
|
"ServerAddr": "127.0.0.1:8024",
|
||||||
|
"Vkey": "1234567890abcdef",
|
||||||
|
"ConnType": "tcp",
|
||||||
|
"AutoReconnection": true,
|
||||||
|
"LogLevel": "info",
|
||||||
|
"RateLimit": "0", // 0 means no limit
|
||||||
|
"FlowStoreDriver": "memory",
|
||||||
|
"MaxConn": "0",
|
||||||
|
"MaxTunnelNum": "0",
|
||||||
|
"TlsEnable": false,
|
||||||
|
"HeartbeatInterval": "30s", // Example format, adjust as needed by parsing logic
|
||||||
|
"HeartbeatTimeout": "10s"
|
||||||
|
},
|
||||||
|
"Tunnels": [
|
||||||
|
{
|
||||||
|
"Mode": "tcp",
|
||||||
|
"ServerPort": 10000,
|
||||||
|
"TargetAddr": "127.0.0.1:8080",
|
||||||
|
"Remark": "web_server_tunnel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "socks5",
|
||||||
|
"ServerPort": 19009,
|
||||||
|
"Remark": "socks5_proxy",
|
||||||
|
"Password": "socks_password"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "httpProxy",
|
||||||
|
"ServerPort": 19010,
|
||||||
|
"Remark": "http_proxy_tunnel",
|
||||||
|
"Username": "proxy_user",
|
||||||
|
"Password": "proxy_password"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "secret",
|
||||||
|
"ServerPort": 19011,
|
||||||
|
"TargetAddr": "192.168.1.100:22",
|
||||||
|
"Password": "secret_key_for_ssh",
|
||||||
|
"Remark": "secret_ssh_tunnel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "p2p",
|
||||||
|
"ServerPort": 19012,
|
||||||
|
"TargetAddr": "remote_peer_vkey", // This might be interpreted differently or might need a specific format
|
||||||
|
"Password": "p2p_password", // Or "PeerUsername" / "PeerPassword" if that's how it's implemented
|
||||||
|
"Remark": "p2p_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "file",
|
||||||
|
"ServerPort": 19013,
|
||||||
|
"LocalPath": "/shared/files",
|
||||||
|
"StripPre": "/serve",
|
||||||
|
"Remark": "file_server_tunnel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mode": "udp",
|
||||||
|
"ServerPort": 19014,
|
||||||
|
"TargetAddr": "10.0.0.5:53",
|
||||||
|
"Remark": "udp_dns_tunnel"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"HealthChecks": [
|
||||||
|
{
|
||||||
|
"Type": "http",
|
||||||
|
"Target": "127.0.0.1:8080", // Target for the health check, could be the local side of a tunnel
|
||||||
|
"Timeout": 5, // seconds
|
||||||
|
"Interval": 60, // seconds
|
||||||
|
"MaxFailures": 3,
|
||||||
|
"HttpUrl": "/status",
|
||||||
|
"Task": "web_server_tunnel" // Associates with the tunnel remark
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "tcp",
|
||||||
|
"Target": "192.168.1.100:22",
|
||||||
|
"Timeout": 3,
|
||||||
|
"Interval": 120,
|
||||||
|
"MaxFailures": 2,
|
||||||
|
"Task": "secret_ssh_tunnel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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,761 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v8.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v8.0": {
|
||||||
|
"Nps.Client/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Hosting": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Hosting.Systemd": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Hosting.WindowsServices": "9.0.5",
|
||||||
|
"Nps.Core": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Nps.Client.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Binder/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.CommandLine.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.FileExtensions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Physical": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Json/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.FileExtensions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"System.Text.Json": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.Json.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.UserSecrets/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Physical": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Configuration.UserSecrets.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Diagnostics/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Diagnostics.Abstractions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"System.Diagnostics.DiagnosticSource": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileProviders.Physical/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileSystemGlobbing": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.FileProviders.Physical.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileSystemGlobbing/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.FileExtensions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.UserSecrets": "9.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection": "9.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Diagnostics": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Physical": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Hosting.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Debug": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.EventLog": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.EventSource": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Hosting.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.Abstractions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.Systemd/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Hosting": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Hosting.Systemd.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.5",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.WindowsServices/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Hosting": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.EventLog": "9.0.5",
|
||||||
|
"System.ServiceProcess.ServiceController": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Hosting.WindowsServices.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.5",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"System.Diagnostics.DiagnosticSource": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Configuration/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": "9.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Console/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Configuration": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"System.Text.Json": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.Console.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Debug/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.Debug.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.EventLog/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"System.Diagnostics.EventLog": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.EventLog.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.EventSource/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5",
|
||||||
|
"System.Text.Json": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Logging.EventSource.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Options/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": "9.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Options": "9.0.5",
|
||||||
|
"Microsoft.Extensions.Primitives": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Primitives/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Diagnostics.DiagnosticSource/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.Diagnostics.DiagnosticSource.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Diagnostics.EventLog/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.Diagnostics.EventLog.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": {
|
||||||
|
"rid": "win",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
},
|
||||||
|
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": {
|
||||||
|
"rid": "win",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.IO.Pipelines/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.IO.Pipelines.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ServiceProcess.ServiceController/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Diagnostics.EventLog": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.ServiceProcess.ServiceController.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.5",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": {
|
||||||
|
"rid": "win",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "9.0.0.5",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Text.Encodings.Web/9.0.5": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.Text.Encodings.Web.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
|
||||||
|
"rid": "browser",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.Text.Json/9.0.5": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.IO.Pipelines": "9.0.5",
|
||||||
|
"System.Text.Encodings.Web": "9.0.5"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0/System.Text.Json.dll": {
|
||||||
|
"assemblyVersion": "9.0.0.0",
|
||||||
|
"fileVersion": "9.0.525.21509"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Nps.Core/1.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"Nps.Core.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Nps.Client/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==",
|
||||||
|
"path": "microsoft.extensions.configuration/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==",
|
||||||
|
"path": "microsoft.extensions.configuration.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Binder/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==",
|
||||||
|
"path": "microsoft.extensions.configuration.binder/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.binder.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-BloAPG22eV+F4CpGKg0lHeXsLxbsGeId4mNpNsUc250j79pcJL3OWVRgmyIUBP5eF74lYJlaOVF+54MRBAQV3A==",
|
||||||
|
"path": "microsoft.extensions.configuration.commandline/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.commandline.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-kfLv3nbn3tt42g/YfPMJGW6SJRt4DLIvSu5njrZv622kBGVOXBMwyoqFLvR/tULzn0mwICJu6GORdUJ+INpexg==",
|
||||||
|
"path": "microsoft.extensions.configuration.environmentvariables/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.environmentvariables.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.FileExtensions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ifrA7POOJ7EeoEJhC8r03WufBsEV4zgnTLQURHh1QIS/vU6ff/60z8M4tD3i2csdFPREEc1nGbiOZhi7Q5aMfw==",
|
||||||
|
"path": "microsoft.extensions.configuration.fileextensions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.fileextensions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Json/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LiWV+Sn5yvoQEd/vihGwkR3CZ4ekMrqP5OQiYOlbzMBfBa6JHBWBsTO5ta6dMYO9ADMiv9K6GBKJSF9DrP29sw==",
|
||||||
|
"path": "microsoft.extensions.configuration.json/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.json.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.UserSecrets/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-DONkv4TzvCUps55pu+667HasjhW5WoKndDPt9AvnF3qnYfgh+OXN01cDdH0h9cfXUXluzAZfGhqh/Uwt14aikg==",
|
||||||
|
"path": "microsoft.extensions.configuration.usersecrets/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.configuration.usersecrets.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==",
|
||||||
|
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Diagnostics/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==",
|
||||||
|
"path": "microsoft.extensions.diagnostics/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.diagnostics.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Diagnostics.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==",
|
||||||
|
"path": "microsoft.extensions.diagnostics.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.diagnostics.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileProviders.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-LLm+e8lvD+jOI+blHRSxPqywPaohOTNcVzQv548R1UpkEiNB2D+zf3RrqxBdB1LDPicRMTnfiaKJovxF8oX1bQ==",
|
||||||
|
"path": "microsoft.extensions.fileproviders.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.fileproviders.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileProviders.Physical/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-cMQqvK0rclKzAm2crSFe9JiimR+wzt6eaoRxa8/mYFkqekY4JEP8eShVZs4NPsKV2HQFHfDgwfFSsWUrUgqbKA==",
|
||||||
|
"path": "microsoft.extensions.fileproviders.physical/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.fileproviders.physical.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.FileSystemGlobbing/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-TWJZJGIyUncH4Ah+Sy9X5mPJeoz02lRlFx9VWaFo4b4o0tkA1dk2u6HRHrfEC2L6N4IC+vFzfRWol1egyQqLtg==",
|
||||||
|
"path": "microsoft.extensions.filesystemglobbing/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.filesystemglobbing.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-PoTG6ptucJyxrrALQgRE5lwUMaSc3PK5vtEXuazEJ6mDQ9xRFmxElZCe81duH/TNH7+X/CVDVIZu6Ji2OQW4zQ==",
|
||||||
|
"path": "microsoft.extensions.hosting/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.hosting.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-3GA/dxqkP6yFe18qYRgtKYuN2onC8NfhlpNN21jptkVKk7olqBTkdT49oL0pSEz2SptRsux7LocCU7+alGnEag==",
|
||||||
|
"path": "microsoft.extensions.hosting.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.hosting.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.Systemd/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-D3iSX8vsCFF8J6da7BIpJwOVtPRU25gmbJ24+HyG4uPWNrybMY9v8MGzcAFAx3ELU75ia+VMTf2VUCAxBTw8gg==",
|
||||||
|
"path": "microsoft.extensions.hosting.systemd/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.hosting.systemd.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.WindowsServices/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-gBjI+sFTGvRDCXYgKitCjNedhcKnbLLa4QuKCcEbqhMLBl8hSfeqwsaYG90xMPNYk/zZQaTh7W2Ykf5+hv0Sew==",
|
||||||
|
"path": "microsoft.extensions.hosting.windowsservices/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.hosting.windowsservices.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==",
|
||||||
|
"path": "microsoft.extensions.logging/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==",
|
||||||
|
"path": "microsoft.extensions.logging.abstractions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.abstractions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Configuration/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==",
|
||||||
|
"path": "microsoft.extensions.logging.configuration/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.configuration.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Console/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-0BqgvX5y34GOrsJeAypny53OoBnXjyjQCpanrpm7dZawKv5KFk7Tqbu7LFVsRu2T0tLpQ2YHMciMiAWtp+o/Bw==",
|
||||||
|
"path": "microsoft.extensions.logging.console/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.console.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Debug/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-IyosWdl/NM2LP72zlavSpkZyd1SczzJ+8J4LImlKWF8w/JEbqJuSJey79Wd1lJGsDj7Cik8y4CD1T2mXMIhEVA==",
|
||||||
|
"path": "microsoft.extensions.logging.debug/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.debug.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.EventLog/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-KF+lvi5ZwNd5Oy5V6l0580cQjTi59boF6X4wp+2ozvUGTC4zBBsaDSVicR86pTWsDivmo9UeSlB+QgheGzrpJQ==",
|
||||||
|
"path": "microsoft.extensions.logging.eventlog/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.eventlog.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.EventSource/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-H4PVv6aDt4jNyZi7MN746GtHPNRjGdH7OrueDViQDBAw/b4incGYEPbUKUACa9HED0vfI4PPaQrzz1Hz5Odh3g==",
|
||||||
|
"path": "microsoft.extensions.logging.eventsource/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.logging.eventsource.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Options/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==",
|
||||||
|
"path": "microsoft.extensions.options/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.options.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==",
|
||||||
|
"path": "microsoft.extensions.options.configurationextensions/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.options.configurationextensions.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Primitives/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==",
|
||||||
|
"path": "microsoft.extensions.primitives/9.0.5",
|
||||||
|
"hashPath": "microsoft.extensions.primitives.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Diagnostics.DiagnosticSource/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==",
|
||||||
|
"path": "system.diagnostics.diagnosticsource/9.0.5",
|
||||||
|
"hashPath": "system.diagnostics.diagnosticsource.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Diagnostics.EventLog/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-nhtTvAgKTD7f6t0bkOb4/hNv0PShb8GHs5Fhn7PvYhwhyWiVyVBvL2vTGH0Hlw5jOZQmWkzQxjY6M/h4tl8M6Q==",
|
||||||
|
"path": "system.diagnostics.eventlog/9.0.5",
|
||||||
|
"hashPath": "system.diagnostics.eventlog.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.IO.Pipelines/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==",
|
||||||
|
"path": "system.io.pipelines/9.0.5",
|
||||||
|
"hashPath": "system.io.pipelines.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.ServiceProcess.ServiceController/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-3mOK5BIwcBHAWzrH9oHCEgwmHecIgoW/P0B42MB8UgG3TqH5K68MBt1/4Mn7znexNP2o6AniDJIXfg04+feELA==",
|
||||||
|
"path": "system.serviceprocess.servicecontroller/9.0.5",
|
||||||
|
"hashPath": "system.serviceprocess.servicecontroller.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Text.Encodings.Web/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==",
|
||||||
|
"path": "system.text.encodings.web/9.0.5",
|
||||||
|
"hashPath": "system.text.encodings.web.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.Text.Json/9.0.5": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==",
|
||||||
|
"path": "system.text.json/9.0.5",
|
||||||
|
"hashPath": "system.text.json.9.0.5.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Nps.Core/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net8.0",
|
||||||
|
"framework": {
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "8.0.0"
|
||||||
|
},
|
||||||
|
"configProperties": {
|
||||||
|
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
|
@ -0,0 +1,21 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Nps.Client")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+df8006792ee2f3d27bf38aeea97fcd9a61e81842")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Nps.Client")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Nps.Client")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
|
@ -0,0 +1 @@
|
||||||
|
bdb388638577b8467efbd53839c530dad589ea242cc53e3f5d6e44356f5fc7e8
|
|
@ -0,0 +1,13 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net8.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property.EnforceExtendedAnalyzerRules =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = Nps.Client
|
||||||
|
build_property.ProjectDir = /app/Nps.Client/
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
@ -0,0 +1,8 @@
|
||||||
|
// <auto-generated/>
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
7a2c9943f2907d473d405e149fde4be6d3ee8106c81933761e2b260e7b4f608a
|
|
@ -0,0 +1,58 @@
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Client
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Client.deps.json
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Client.runtimeconfig.json
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Client.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Client.pdb
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Binder.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.CommandLine.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Json.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Physical.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.IO.Pipelines.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.Text.Encodings.Web.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.Text.Json.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Core.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Nps.Core.pdb
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.csproj.AssemblyReference.cache
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.AssemblyInfoInputs.cache
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.AssemblyInfo.cs
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.csproj.CoreCompileInputs.cache
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.sourcelink.json
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.csproj.CopyComplete
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.dll
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/refint/Nps.Client.dll
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.pdb
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/Nps.Client.genruntimeconfig.cache
|
||||||
|
/app/Nps.Client/obj/Debug/net8.0/ref/Nps.Client.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Configuration.UserSecrets.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Diagnostics.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Hosting.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Hosting.Systemd.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Hosting.WindowsServices.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.Configuration.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.Console.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.Debug.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.EventLog.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Logging.EventSource.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.Diagnostics.EventLog.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/System.ServiceProcess.ServiceController.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll
|
||||||
|
/app/Nps.Client/bin/Debug/net8.0/runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
6a23418542980450ccb7c9e9688e9c883407b20791d7450f89d06cbf1e2b80a4
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
{"documents":{"/app/*":"https://raw.githubusercontent.com/Shurrik0030/nps/df8006792ee2f3d27bf38aeea97fcd9a61e81842/*"}}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,148 @@
|
||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/app/Nps.Client/Nps.Client.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/app/Nps.Client/Nps.Client.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/app/Nps.Client/Nps.Client.csproj",
|
||||||
|
"projectName": "Nps.Client",
|
||||||
|
"projectPath": "/app/Nps.Client/Nps.Client.csproj",
|
||||||
|
"packagesPath": "/home/swebot/.nuget/packages/",
|
||||||
|
"outputPath": "/app/Nps.Client/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/swebot/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net8.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net8.0": {
|
||||||
|
"targetAlias": "net8.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/app/Nps.Core/Nps.Core.csproj": {
|
||||||
|
"projectPath": "/app/Nps.Core/Nps.Core.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net8.0": {
|
||||||
|
"targetAlias": "net8.0",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Json": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.Systemd": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Hosting.WindowsServices": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[9.0.5, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.116/PortableRuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/app/Nps.Core/Nps.Core.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/app/Nps.Core/Nps.Core.csproj",
|
||||||
|
"projectName": "Nps.Core",
|
||||||
|
"projectPath": "/app/Nps.Core/Nps.Core.csproj",
|
||||||
|
"packagesPath": "/home/swebot/.nuget/packages/",
|
||||||
|
"outputPath": "/app/Nps.Core/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/swebot/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net8.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net8.0": {
|
||||||
|
"targetAlias": "net8.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net8.0": {
|
||||||
|
"targetAlias": "net8.0",
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.116/PortableRuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/swebot/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/swebot/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.1</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/home/swebot/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Configuration.UserSecrets.props" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Configuration.UserSecrets.props')" />
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<Import Project="$(NuGetPackageRoot)system.text.json/9.0.5/buildTransitive/net8.0/System.Text.Json.targets" Condition="Exists('$(NuGetPackageRoot)system.text.json/9.0.5/buildTransitive/net8.0/System.Text.Json.targets')" />
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.extensions.options/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Options.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.options/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Options.targets')" />
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.binder/9.0.5/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.binder/9.0.5/buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets')" />
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets')" />
|
||||||
|
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Configuration.UserSecrets.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets/9.0.5/buildTransitive/net8.0/Microsoft.Extensions.Configuration.UserSecrets.targets')" />
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "3TX4j2ex2BAZd0GhEQyDQfeNBmaCiEyclM0+gqTlnaA0IYxpDIvUYXShXvU4b9eW9m8hUSVZl8GHKR2nLpgg1g==",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "/app/Nps.Client/Nps.Client.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration/9.0.5/microsoft.extensions.configuration.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.abstractions/9.0.5/microsoft.extensions.configuration.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.binder/9.0.5/microsoft.extensions.configuration.binder.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.commandline/9.0.5/microsoft.extensions.configuration.commandline.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.environmentvariables/9.0.5/microsoft.extensions.configuration.environmentvariables.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.fileextensions/9.0.5/microsoft.extensions.configuration.fileextensions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.json/9.0.5/microsoft.extensions.configuration.json.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.configuration.usersecrets/9.0.5/microsoft.extensions.configuration.usersecrets.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.dependencyinjection/9.0.5/microsoft.extensions.dependencyinjection.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/9.0.5/microsoft.extensions.dependencyinjection.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.diagnostics/9.0.5/microsoft.extensions.diagnostics.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.diagnostics.abstractions/9.0.5/microsoft.extensions.diagnostics.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.fileproviders.abstractions/9.0.5/microsoft.extensions.fileproviders.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.fileproviders.physical/9.0.5/microsoft.extensions.fileproviders.physical.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.filesystemglobbing/9.0.5/microsoft.extensions.filesystemglobbing.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.hosting/9.0.5/microsoft.extensions.hosting.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.hosting.abstractions/9.0.5/microsoft.extensions.hosting.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.hosting.systemd/9.0.5/microsoft.extensions.hosting.systemd.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.hosting.windowsservices/9.0.5/microsoft.extensions.hosting.windowsservices.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging/9.0.5/microsoft.extensions.logging.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.abstractions/9.0.5/microsoft.extensions.logging.abstractions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.configuration/9.0.5/microsoft.extensions.logging.configuration.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.console/9.0.5/microsoft.extensions.logging.console.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.debug/9.0.5/microsoft.extensions.logging.debug.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.eventlog/9.0.5/microsoft.extensions.logging.eventlog.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.logging.eventsource/9.0.5/microsoft.extensions.logging.eventsource.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.options/9.0.5/microsoft.extensions.options.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.options.configurationextensions/9.0.5/microsoft.extensions.options.configurationextensions.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/microsoft.extensions.primitives/9.0.5/microsoft.extensions.primitives.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.diagnostics.diagnosticsource/9.0.5/system.diagnostics.diagnosticsource.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.diagnostics.eventlog/9.0.5/system.diagnostics.eventlog.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.io.pipelines/9.0.5/system.io.pipelines.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.serviceprocess.servicecontroller/9.0.5/system.serviceprocess.servicecontroller.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.text.encodings.web/9.0.5/system.text.encodings.web.9.0.5.nupkg.sha512",
|
||||||
|
"/home/swebot/.nuget/packages/system.text.json/9.0.5/system.text.json.9.0.5.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Nps.Core;
|
||||||
|
|
||||||
|
public class Class1
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,126 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
using Nps.Core.Serialization;
|
||||||
|
|
||||||
|
namespace Nps.Core.Config
|
||||||
|
{
|
||||||
|
public class NpcClientConfig
|
||||||
|
{
|
||||||
|
public CommonConfig? Common { get; set; }
|
||||||
|
|
||||||
|
[JsonConverter(typeof(TunnelListJsonConverter))]
|
||||||
|
public List<TunnelConfig> Tunnels { get; set; } = new List<TunnelConfig>();
|
||||||
|
public List<HealthCheckConfig> HealthChecks { get; set; } = new List<HealthCheckConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommonConfig
|
||||||
|
{
|
||||||
|
public string? ServerAddr { get; set; }
|
||||||
|
public string? ConnType { get; set; }
|
||||||
|
public string? Vkey { get; set; }
|
||||||
|
public bool AutoReconnection { get; set; }
|
||||||
|
public string? LogLevel { get; set; }
|
||||||
|
public string? RateLimit { get; set; } // e.g., "10M"
|
||||||
|
public string? FlowStoreDriver { get; set; }
|
||||||
|
public string? MaxConn { get; set; }
|
||||||
|
public string? MaxTunnelNum { get; set; }
|
||||||
|
public string? ProxyUrl { get; set; }
|
||||||
|
public bool TlsEnable { get; set; }
|
||||||
|
public string? TlsVerify { get; set; } // true/false or path to CA
|
||||||
|
public string? TlsCertFile { get; set; }
|
||||||
|
public string? TlsKeyFile { get; set; }
|
||||||
|
public string? TlsServerName { get; set; }
|
||||||
|
public bool MultiAccount { get; set; }
|
||||||
|
public string? ConfigFile { get; set; }
|
||||||
|
public string? HeartbeatInterval { get; set; }
|
||||||
|
public string? HeartbeatTimeout { get; set; }
|
||||||
|
public string? ClientSecret { get; set; }
|
||||||
|
public string? ClientId { get; set; }
|
||||||
|
public string? NpHttpEnable { get; set; } // true/false
|
||||||
|
public string? NpHttpServer { get; set; }
|
||||||
|
public string? NpHttpUsername { get; set; }
|
||||||
|
public string? NpHttpPassword { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonDerivedType(typeof(TcpTunnelConfig), typeDiscriminator: "tcp")]
|
||||||
|
[JsonDerivedType(typeof(UdpTunnelConfig), typeDiscriminator: "udp")]
|
||||||
|
[JsonDerivedType(typeof(Socks5TunnelConfig), typeDiscriminator: "socks5")]
|
||||||
|
[JsonDerivedType(typeof(HttpProxyTunnelConfig), typeDiscriminator: "httpProxy")]
|
||||||
|
[JsonDerivedType(typeof(SecretTunnelConfig), typeDiscriminator: "secret")]
|
||||||
|
[JsonDerivedType(typeof(P2pTunnelConfig), typeDiscriminator: "p2p")]
|
||||||
|
[JsonDerivedType(typeof(FileTunnelConfig), typeDiscriminator: "file")]
|
||||||
|
public abstract class TunnelConfig
|
||||||
|
{
|
||||||
|
public string? Mode { get; set; }
|
||||||
|
public string? TargetAddr { get; set; } // Target address and port (e.g., "127.0.0.1:80")
|
||||||
|
public int ServerPort { get; set; } // Port on the NPS server to expose
|
||||||
|
public string? Remark { get; set; }
|
||||||
|
public string? ClientId { get; set; } // For multi-account, associate with specific client_id
|
||||||
|
public string? FlowLimit { get; set; } // e.g., "1G" or "10M"
|
||||||
|
public string? MaxConn { get; set; }
|
||||||
|
public string? Password { get; set; } // Used by multiple tunnel types
|
||||||
|
public string? LocalPath { get; set; } // Used by file tunnel
|
||||||
|
public string? StripPre { get; set; } // Used by file tunnel
|
||||||
|
public string? TlsEnable { get; set; } // true/false
|
||||||
|
public string? ProxyUrl { get; set; } // Used by socks5, httpProxy
|
||||||
|
public string? HealthCheckType { get; set; } // tcp, http
|
||||||
|
public string? HealthCheckTarget { get; set; } // ip:port
|
||||||
|
public string? HealthCheckTimeout { get; set; } // seconds
|
||||||
|
public string? HealthCheckInterval { get; set; } // seconds
|
||||||
|
public string? HealthCheckFailMax { get; set; } // count
|
||||||
|
public string? HealthCheckHttpUrl { get; set; } // for http health check
|
||||||
|
public string? HealthCheckHttpHost { get; set; } // for http health check
|
||||||
|
public string? Username { get; set; } // for httpProxy, socks5
|
||||||
|
public string? AllowIps { get; set; } // comma-separated list of allowed IPs
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TcpTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// TCP specific properties if any in future
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UdpTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// UDP specific properties
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Socks5TunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// Socks5 specific properties
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HttpProxyTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// HTTP Proxy specific properties
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SecretTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// Secret tunnel specific properties
|
||||||
|
}
|
||||||
|
|
||||||
|
public class P2pTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
public string? PeerUsername { get; set; }
|
||||||
|
public string? PeerPassword { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FileTunnelConfig : TunnelConfig
|
||||||
|
{
|
||||||
|
// File tunnel specific properties (LocalPath, StripPre already in base)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class HealthCheckConfig
|
||||||
|
{
|
||||||
|
public string? Type { get; set; } // e.g., "tcp", "http"
|
||||||
|
public string? Target { get; set; } // Address and port to check (e.g., "127.0.0.1:8080")
|
||||||
|
public int Timeout { get; set; } // Seconds
|
||||||
|
public int Interval { get; set; } // Seconds
|
||||||
|
public int MaxFailures { get; set; } // Number of failures before considering down
|
||||||
|
public string? HttpUrl { get; set; } // For HTTP checks
|
||||||
|
public string? HttpHost { get; set; } // For HTTP checks
|
||||||
|
public string? Task { get; set; } // Associated task/tunnel remark or ID
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,81 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Nps.Core.Config
|
||||||
|
{
|
||||||
|
public class NpsServerConfig
|
||||||
|
{
|
||||||
|
public string? RunMode { get; set; }
|
||||||
|
public string? HttpProxyIp { get; set; }
|
||||||
|
public int HttpProxyPort { get; set; }
|
||||||
|
public string? BridgeType { get; set; }
|
||||||
|
public int BridgePort { get; set; }
|
||||||
|
public string? PublicVkey { get; set; }
|
||||||
|
public string? LogLevel { get; set; }
|
||||||
|
public WebConfig? Web { get; set; }
|
||||||
|
public string? AuthCryptKey { get; set; }
|
||||||
|
public int DisconnectTimeout { get; set; }
|
||||||
|
public FlowConfig? Flow { get; set; }
|
||||||
|
public IpLimitConfig? IpLimit { get; set; }
|
||||||
|
public BridgeConfig? Bridge { get; set; }
|
||||||
|
public HttpsConfig? Https { get; set; }
|
||||||
|
public NpHttpConfig? NpHttp { get; set; }
|
||||||
|
public string? TlsEnable { get; set; }
|
||||||
|
public string? TlsCertFile { get; set; }
|
||||||
|
public string? TlsKeyFile { get; set; }
|
||||||
|
public string? Pprof { get; set; }
|
||||||
|
public int PprofPort { get; set; }
|
||||||
|
|
||||||
|
// TLS settings for the bridge/tunneling service
|
||||||
|
public string? BridgeTlsCertPath { get; set; }
|
||||||
|
public string? BridgeTlsCertPassword { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class WebConfig
|
||||||
|
{
|
||||||
|
public string? Host { get; set; }
|
||||||
|
public string? Username { get; set; }
|
||||||
|
public string? Password { get; set; }
|
||||||
|
public int Port { get; set; }
|
||||||
|
public string? Path { get; set; }
|
||||||
|
public string? Type { get; set; }
|
||||||
|
public bool UseCompress { get; set; }
|
||||||
|
public bool UseCache { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FlowConfig
|
||||||
|
{
|
||||||
|
public int StoreDriver { get; set; }
|
||||||
|
public int ClientMaxLimit { get; set; }
|
||||||
|
public int ServerMaxLimit { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IpLimitConfig
|
||||||
|
{
|
||||||
|
public bool Enable { get; set; }
|
||||||
|
public int MaxIpConnect { get; set; }
|
||||||
|
public int MaxTunnelConnect { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BridgeConfig
|
||||||
|
{
|
||||||
|
public string? Ip { get; set; }
|
||||||
|
public string? Domain { get; set; }
|
||||||
|
public string? ServerPath { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HttpsConfig
|
||||||
|
{
|
||||||
|
public bool ProxyTlsEnable { get; set; }
|
||||||
|
public string? ProxyTlsCertFile { get; set; }
|
||||||
|
public string? ProxyTlsKeyFile { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NpHttpConfig
|
||||||
|
{
|
||||||
|
public bool Enable { get; set; }
|
||||||
|
public string? Server { get; set; }
|
||||||
|
public string? Username { get; set; }
|
||||||
|
public string? Password { get; set; }
|
||||||
|
public string? ProxyUrl { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
namespace Nps.Core.Protocol
|
||||||
|
{
|
||||||
|
public static class ProtocolConstants
|
||||||
|
{
|
||||||
|
// Represents the Go constant common.CONN_TEST = "4V"
|
||||||
|
// Decimal values: 18, 52, 86
|
||||||
|
// Hex values: 0x12, 0x34, 0x56
|
||||||
|
public static readonly byte[] ConnTestBytes = new byte[] { 0x12, 0x34, 0x56 };
|
||||||
|
|
||||||
|
// It might be useful to have the string representation as well,
|
||||||
|
// but care must be taken with encoding if it's used directly.
|
||||||
|
// For matching network bytes, ConnTestBytes is primary.
|
||||||
|
public const string ConnTestString = "\u00124V";
|
||||||
|
|
||||||
|
// Other protocol-wide constants can be added here.
|
||||||
|
// For example, default buffer sizes, timeout values not meant for configuration, etc.
|
||||||
|
public const int DefaultBufferSize = 4096; // Example
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Nps.Core.Protocol
|
||||||
|
{
|
||||||
|
//[Serializable] // Only needed if using BinaryFormatter, prefer System.Text.Json
|
||||||
|
public class LinkInformation
|
||||||
|
{
|
||||||
|
// Parameterless constructor for JSON deserialization
|
||||||
|
public LinkInformation() { }
|
||||||
|
|
||||||
|
public LinkInformation(string targetHost, string targetType, bool isEncrypted, bool isCompressed, string? clientRemoteAddr, bool isLocalProxy)
|
||||||
|
{
|
||||||
|
TargetHost = targetHost;
|
||||||
|
TargetType = targetType;
|
||||||
|
IsEncrypted = isEncrypted;
|
||||||
|
IsCompressed = isCompressed;
|
||||||
|
ClientRemoteAddr = clientRemoteAddr;
|
||||||
|
IsLocalProxy = isLocalProxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string? TargetHost { get; set; } // e.g., "127.0.0.1:8080"
|
||||||
|
public string? TargetType { get; set; } // e.g., "tcp", "udp"
|
||||||
|
|
||||||
|
// In Go code, Crypt and Compress are bools in conn.Link. Let's map them directly.
|
||||||
|
public bool IsEncrypted { get; set; }
|
||||||
|
public bool IsCompressed { get; set; }
|
||||||
|
|
||||||
|
public string? ClientRemoteAddr { get; set; } // Original user's IP, if available/forwarded
|
||||||
|
public bool IsLocalProxy { get; set; } // Indicates if the link is for a local proxy setup (e.g. socks5, http proxy on client side)
|
||||||
|
|
||||||
|
// Consider adding other fields if they are part of the Link info exchange
|
||||||
|
// For example, a unique ID for the link, or specific task ID it relates to.
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,206 @@
|
||||||
|
using System;
|
||||||
|
using System.Buffers.Binary;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Nps.Core.Protocol.Utils
|
||||||
|
{
|
||||||
|
public static class NetworkHelper
|
||||||
|
{
|
||||||
|
private const int LengthPrefixSize = 4; // For Int32 length prefix
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a single byte flag to the stream. Assumes the flag string is a single character.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task WriteFlagAsync(Stream stream, string flag, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(flag) || flag.Length != 1)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Flag must be a single character string.", nameof(flag));
|
||||||
|
}
|
||||||
|
byte[] flagByte = Encoding.ASCII.GetBytes(flag); // Or UTF8 if flags can be non-ASCII
|
||||||
|
await stream.WriteAsync(flagByte, 0, 1, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a single byte flag from the stream and converts it to a string.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<string?> ReadFlagAsync(Stream stream, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
byte[] flagByte = new byte[1];
|
||||||
|
int bytesRead = await ReadWithTimeoutAsync(stream, flagByte, 0, 1, cancellationToken);
|
||||||
|
if (bytesRead == 1)
|
||||||
|
{
|
||||||
|
return Encoding.ASCII.GetString(flagByte); // Or UTF8
|
||||||
|
}
|
||||||
|
return null; // Or throw exception if flag is mandatory
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a byte array to the stream, prefixed by its length (Int32, LittleEndian).
|
||||||
|
/// </summary>
|
||||||
|
public static async Task WriteBytesWithLengthPrefixAsync(Stream stream, byte[] data, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (data == null) throw new ArgumentNullException(nameof(data));
|
||||||
|
|
||||||
|
byte[] lengthBytes = new byte[LengthPrefixSize];
|
||||||
|
BinaryPrimitives.WriteInt32LittleEndian(lengthBytes, data.Length);
|
||||||
|
|
||||||
|
await stream.WriteAsync(lengthBytes, 0, LengthPrefixSize, cancellationToken);
|
||||||
|
await stream.WriteAsync(data, 0, data.Length, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a byte array from the stream that is prefixed by its length (Int32, LittleEndian).
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<byte[]?> ReadBytesWithLengthPrefixAsync(Stream stream, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
byte[] lengthBytes = new byte[LengthPrefixSize];
|
||||||
|
int bytesRead = await ReadWithTimeoutAsync(stream, lengthBytes, 0, LengthPrefixSize, cancellationToken);
|
||||||
|
|
||||||
|
if (bytesRead < LengthPrefixSize)
|
||||||
|
{
|
||||||
|
// Not enough data for length prefix, could be connection closed or timeout
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dataLength = BinaryPrimitives.ReadInt32LittleEndian(lengthBytes);
|
||||||
|
if (dataLength < 0) // Or some reasonable max length check
|
||||||
|
{
|
||||||
|
throw new IOException("Invalid data length received.");
|
||||||
|
}
|
||||||
|
if (dataLength == 0)
|
||||||
|
{
|
||||||
|
return Array.Empty<byte>();
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] data = new byte[dataLength];
|
||||||
|
bytesRead = await ReadWithTimeoutAsync(stream, data, 0, dataLength, cancellationToken);
|
||||||
|
|
||||||
|
if (bytesRead < dataLength)
|
||||||
|
{
|
||||||
|
// Not enough data received, could be connection closed or timeout
|
||||||
|
// Consider how to handle partial reads if that's a valid scenario.
|
||||||
|
// For now, assuming full message or error.
|
||||||
|
throw new EndOfStreamException($"Expected {dataLength} bytes but only received {bytesRead}.");
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a string to the stream, UTF-8 encoded, prefixed by its byte length.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task WriteStringWithLengthPrefixAsync(Stream stream, string text, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (text == null) throw new ArgumentNullException(nameof(text));
|
||||||
|
byte[] data = Encoding.UTF8.GetBytes(text);
|
||||||
|
await WriteBytesWithLengthPrefixAsync(stream, data, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a UTF-8 encoded string from the stream that was prefixed by its byte length.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<string?> ReadStringWithLengthPrefixAsync(Stream stream, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
byte[]? data = await ReadBytesWithLengthPrefixAsync(stream, cancellationToken);
|
||||||
|
return data != null ? Encoding.UTF8.GetString(data) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes the provided byte array directly to the stream.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task WriteFixedLengthBytesAsync(Stream stream, byte[] data, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (data == null) throw new ArgumentNullException(nameof(data));
|
||||||
|
await stream.WriteAsync(data, 0, data.Length, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a fixed number of bytes from the stream.
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="EndOfStreamException">Thrown if the end of the stream is reached before reading the specified number of bytes.</exception>
|
||||||
|
public static async Task<byte[]> ReadFixedLengthBytesAsync(Stream stream, int length, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (length < 0) throw new ArgumentOutOfRangeException(nameof(length));
|
||||||
|
if (length == 0) return Array.Empty<byte>();
|
||||||
|
|
||||||
|
byte[] buffer = new byte[length];
|
||||||
|
int totalBytesRead = 0;
|
||||||
|
while (totalBytesRead < length)
|
||||||
|
{
|
||||||
|
int bytesRead = await ReadWithTimeoutAsync(stream, buffer, totalBytesRead, length - totalBytesRead, cancellationToken);
|
||||||
|
if (bytesRead == 0) // Stream closed or timeout occurred before any byte was read in this call
|
||||||
|
{
|
||||||
|
throw new EndOfStreamException($"Connection closed prematurely. Expected {length} bytes but only received {totalBytesRead}.");
|
||||||
|
}
|
||||||
|
totalBytesRead += bytesRead;
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper method to read from a Stream with a timeout if CancellationToken is used.
|
||||||
|
/// </summary>
|
||||||
|
private static async Task<int> ReadWithTimeoutAsync(Stream stream, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// If cancellationToken is default or None, just call ReadAsync
|
||||||
|
if (cancellationToken == default || cancellationToken == CancellationToken.None)
|
||||||
|
{
|
||||||
|
return await stream.ReadAsync(buffer, offset, count, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a task that completes when ReadAsync completes or when cancellation is requested
|
||||||
|
var readTask = stream.ReadAsync(buffer, offset, count, cancellationToken);
|
||||||
|
|
||||||
|
// Awaiting the task will throw OperationCanceledException if cancellationToken is triggered during the read.
|
||||||
|
return await readTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes the predefined CONN_TEST byte sequence to the stream.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task WriteConnTestAsync(Stream stream, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
await stream.WriteAsync(ProtocolConstants.ConnTestBytes, 0, ProtocolConstants.ConnTestBytes.Length, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a sequence of bytes from the stream and verifies if it matches ProtocolConstants.ConnTestBytes.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if the sequence matches, false otherwise.</returns>
|
||||||
|
public static async Task<bool> VerifyConnTestAsync(Stream stream, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[ProtocolConstants.ConnTestBytes.Length];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int bytesRead = await ReadWithTimeoutAsync(stream, buffer, 0, buffer.Length, cancellationToken);
|
||||||
|
if (bytesRead < buffer.Length)
|
||||||
|
{
|
||||||
|
return false; // Not enough bytes read to match
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < buffer.Length; i++)
|
||||||
|
{
|
||||||
|
if (buffer[i] != ProtocolConstants.ConnTestBytes[i])
|
||||||
|
{
|
||||||
|
return false; // Byte sequence mismatch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true; // Sequence matches
|
||||||
|
}
|
||||||
|
catch (IOException)
|
||||||
|
{
|
||||||
|
// Handle stream read errors (e.g., connection closed) as verification failure
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// If operation was cancelled, verification didn't complete
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
namespace Nps.Core.Protocol
|
||||||
|
{
|
||||||
|
public static class WorkTypes
|
||||||
|
{
|
||||||
|
// Connection establishment and verification
|
||||||
|
public const string ConnTest = "t"; // Test connection viability (may not be a work type but an initial handshake byte)
|
||||||
|
public const string VerifyReq = "v"; // Request from client to verify VKey / credentials
|
||||||
|
public const string VerifyErr = "e"; // Verification error from server
|
||||||
|
public const string VerifySuccess = "s"; // Verification success from server
|
||||||
|
|
||||||
|
// Core work types for data tunneling / proxying
|
||||||
|
public const string WorkMain = "m"; // Main work connection (e.g., for TCP, UDP proxy)
|
||||||
|
public const string WorkChan = "c"; // Channel for data transfer within a main work connection (e.g., new TCP connection for a tunnel)
|
||||||
|
|
||||||
|
// Configuration and control messages
|
||||||
|
public const string WorkConfig = "g"; // Client requests configuration from server
|
||||||
|
public const string NewConf = "o"; // Client sends new configuration to server (e.g. from npc.conf)
|
||||||
|
public const string NewHost = "h"; // Client sends new host information to server (part of config sync)
|
||||||
|
public const string NewTask = "a"; // Client sends new task (tunnel) information (part of config sync)
|
||||||
|
// Server might also send this to client if server-side changes dictate a new task for client? (Needs clarification)
|
||||||
|
|
||||||
|
// Specific tunnel types / features
|
||||||
|
public const string WorkRegister = "r"; // Client registers itself (e.g. for P2P or specific auth)
|
||||||
|
public const string WorkSecret = "x"; // Secret tunnel related work
|
||||||
|
public const string WorkFile = "f"; // File tunnel related work
|
||||||
|
public const string WorkP2p = "p"; // P2P tunnel related work
|
||||||
|
|
||||||
|
// UDP specific
|
||||||
|
public const string NewUdpConn = "u"; // Server signals client to establish a new UDP connection for a tunnel
|
||||||
|
|
||||||
|
// Status and Keep-alive
|
||||||
|
public const string WorkStatus = "w"; // Client requests status from server / sends its status
|
||||||
|
public const string KeepAlive = "k"; // Keep-alive packet (not in original list, but common)
|
||||||
|
|
||||||
|
// Placeholder for other types if discovered
|
||||||
|
// Example: Client disconnect signal, error messages etc.
|
||||||
|
// public const string Disconnect = "d";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Nps.Core.Security
|
||||||
|
{
|
||||||
|
public static class CryptoUtils
|
||||||
|
{
|
||||||
|
public static byte[] ToMd5HashBytes(string input)
|
||||||
|
{
|
||||||
|
if (input == null) throw new ArgumentNullException(nameof(input));
|
||||||
|
|
||||||
|
using (MD5 md5 = MD5.Create())
|
||||||
|
{
|
||||||
|
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
|
||||||
|
byte[] hashBytes = md5.ComputeHash(inputBytes);
|
||||||
|
return hashBytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToMd5Hash(string input)
|
||||||
|
{
|
||||||
|
if (input == null) throw new ArgumentNullException(nameof(input));
|
||||||
|
|
||||||
|
byte[] hashBytes = ToMd5HashBytes(input);
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < hashBytes.Length; i++)
|
||||||
|
{
|
||||||
|
sb.Append(hashBytes[i].ToString("x2")); // Hexadecimal format
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
using System;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Nps.Core.Sessions
|
||||||
|
{
|
||||||
|
public class ClientSession : IDisposable
|
||||||
|
{
|
||||||
|
public string ClientId { get; }
|
||||||
|
public string? Version { get; set; } // Full version from client
|
||||||
|
public string? CoreVersion { get; set; } // Core version from client
|
||||||
|
|
||||||
|
public Stream? SignalStream { get; set; }
|
||||||
|
public Stream? MuxStream { get; set; } // Placeholder, will be replaced by MUX handler later
|
||||||
|
|
||||||
|
public DateTime LastHeartbeat { get; set; }
|
||||||
|
public CancellationTokenSource Cts { get; }
|
||||||
|
|
||||||
|
private bool _disposed = false;
|
||||||
|
|
||||||
|
public ClientSession(string clientId)
|
||||||
|
{
|
||||||
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
Cts = new CancellationTokenSource();
|
||||||
|
LastHeartbeat = DateTime.UtcNow; // Initialize to now
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateHeartbeat()
|
||||||
|
{
|
||||||
|
LastHeartbeat = DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
if (!_disposed)
|
||||||
|
{
|
||||||
|
if (!Cts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
Cts.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close streams carefully, they might be null or already closed
|
||||||
|
// The owner of the session should log any errors during stream closure if necessary.
|
||||||
|
try { SignalStream?.Close(); SignalStream?.Dispose(); } catch { /* Ignore */ }
|
||||||
|
try { MuxStream?.Close(); MuxStream?.Dispose(); } catch { /* Ignore */ }
|
||||||
|
|
||||||
|
Cts.Dispose();
|
||||||
|
_disposed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using Nps.Core.Config;
|
||||||
|
|
||||||
|
namespace Nps.Core.Serialization
|
||||||
|
{
|
||||||
|
public class TunnelListJsonConverter : JsonConverter<List<TunnelConfig>>
|
||||||
|
{
|
||||||
|
public override List<TunnelConfig> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
if (reader.TokenType != JsonTokenType.StartArray)
|
||||||
|
{
|
||||||
|
throw new JsonException("Expected StartArray token");
|
||||||
|
}
|
||||||
|
|
||||||
|
var list = new List<TunnelConfig>();
|
||||||
|
var optionsWithoutThisConverter = new JsonSerializerOptions(options);
|
||||||
|
optionsWithoutThisConverter.Converters.Remove(this); // Avoid re-entrancy
|
||||||
|
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
if (reader.TokenType == JsonTokenType.EndArray)
|
||||||
|
{
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reader.TokenType == JsonTokenType.StartObject)
|
||||||
|
{
|
||||||
|
// Peek at the "Mode" property to determine the type
|
||||||
|
Utf8JsonReader readerClone = reader; // Clone to read ahead without advancing the main reader
|
||||||
|
string? mode = null;
|
||||||
|
string? currentPropertyName = null;
|
||||||
|
|
||||||
|
while(readerClone.Read() && readerClone.TokenType != JsonTokenType.EndObject)
|
||||||
|
{
|
||||||
|
if (readerClone.TokenType == JsonTokenType.PropertyName)
|
||||||
|
{
|
||||||
|
currentPropertyName = readerClone.GetString();
|
||||||
|
}
|
||||||
|
else if (readerClone.TokenType == JsonTokenType.String && currentPropertyName == "Mode")
|
||||||
|
{
|
||||||
|
mode = readerClone.GetString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(mode))
|
||||||
|
{
|
||||||
|
// This case should ideally not be hit if JSON is well-formed and Mode is present.
|
||||||
|
// If it can happen, one might deserialize to JsonElement first, inspect, then convert.
|
||||||
|
// For now, throwing an exception is clear.
|
||||||
|
throw new JsonException("Tunnel 'Mode' property not found, not a string, or not found early enough in the JSON object for this converter logic.");
|
||||||
|
}
|
||||||
|
|
||||||
|
TunnelConfig? tunnel = mode.ToLowerInvariant() switch
|
||||||
|
{
|
||||||
|
"tcp" => JsonSerializer.Deserialize<TcpTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"udp" => JsonSerializer.Deserialize<UdpTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"socks5" => JsonSerializer.Deserialize<Socks5TunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"httpproxy" => JsonSerializer.Deserialize<HttpProxyTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"secret" => JsonSerializer.Deserialize<SecretTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"p2p" => JsonSerializer.Deserialize<P2pTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
"file" => JsonSerializer.Deserialize<FileTunnelConfig>(ref reader, optionsWithoutThisConverter),
|
||||||
|
_ => throw new JsonException($"Unknown tunnel mode: {mode}")
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tunnel != null)
|
||||||
|
{
|
||||||
|
list.Add(tunnel);
|
||||||
|
}
|
||||||
|
// If tunnel is null after deserialization (e.g. if the JSON object was just "null"),
|
||||||
|
// it's implicitly skipped, which is often desired.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Skip over other token types if necessary, or throw error
|
||||||
|
throw new JsonException($"Unexpected token {reader.TokenType}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new JsonException("Expected EndArray token");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(Utf8JsonWriter writer, List<TunnelConfig> value, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
writer.WriteStartArray();
|
||||||
|
var optionsWithoutThisConverter = new JsonSerializerOptions(options);
|
||||||
|
optionsWithoutThisConverter.Converters.Remove(this); // Avoid re-entrancy
|
||||||
|
|
||||||
|
foreach (var tunnel in value)
|
||||||
|
{
|
||||||
|
if (tunnel == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullValue();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Rely on [JsonDerivedType] attributes for serialization if System.Text.Json supports it well enough.
|
||||||
|
// Or explicitly cast and serialize.
|
||||||
|
JsonSerializer.Serialize(writer, tunnel, tunnel.GetType(), optionsWithoutThisConverter);
|
||||||
|
}
|
||||||
|
writer.WriteEndArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
namespace Nps.Core
|
||||||
|
{
|
||||||
|
public static class VersionInfo
|
||||||
|
{
|
||||||
|
// These should ideally match or be compatible with the Go version's core protocol version.
|
||||||
|
// Example: "0.1" or similar, reflecting the core interop version.
|
||||||
|
public const string CoreVersion = "0.26.10"; // Placeholder, align with Go's version.GetVersion() output for core features
|
||||||
|
|
||||||
|
// This can be the specific .NET implementation's version.
|
||||||
|
public const string FullVersion = "0.1.0-dotnet"; // Example version for this .NET port
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v8.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v8.0": {
|
||||||
|
"Nps.Core/1.0.0": {
|
||||||
|
"runtime": {
|
||||||
|
"Nps.Core.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Nps.Core/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
|
@ -0,0 +1,21 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Nps.Core")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+df8006792ee2f3d27bf38aeea97fcd9a61e81842")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Nps.Core")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Nps.Core")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
|
@ -0,0 +1 @@
|
||||||
|
3c5b813e1db179eb307d54053b71d4a32870fd7217e49133f0dd3a4ca94b6837
|
|
@ -0,0 +1,13 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net8.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property.EnforceExtendedAnalyzerRules =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = Nps.Core
|
||||||
|
build_property.ProjectDir = /app/Nps.Core/
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
@ -0,0 +1,8 @@
|
||||||
|
// <auto-generated/>
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
ccc3345d4b8043b0da3ec87f1246aac85996f7bafeb0fa62d384d90a39d126dd
|
|
@ -0,0 +1,12 @@
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.AssemblyInfoInputs.cache
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.AssemblyInfo.cs
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.csproj.CoreCompileInputs.cache
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.sourcelink.json
|
||||||
|
/app/Nps.Core/bin/Debug/net8.0/Nps.Core.deps.json
|
||||||
|
/app/Nps.Core/bin/Debug/net8.0/Nps.Core.dll
|
||||||
|
/app/Nps.Core/bin/Debug/net8.0/Nps.Core.pdb
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.dll
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/refint/Nps.Core.dll
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/Nps.Core.pdb
|
||||||
|
/app/Nps.Core/obj/Debug/net8.0/ref/Nps.Core.dll
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
{"documents":{"/app/*":"https://raw.githubusercontent.com/Shurrik0030/nps/df8006792ee2f3d27bf38aeea97fcd9a61e81842/*"}}
|
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue