adjustments to config and cleanup nuget, remove implicit usings
This commit is contained in:
		| @@ -66,7 +66,7 @@ namespace MareSynchronosServer.Hubs | |||||||
|                     IsForbidden = forbiddenFile != null, |                     IsForbidden = forbiddenFile != null, | ||||||
|                     Hash = hash.Key, |                     Hash = hash.Key, | ||||||
|                     Size = hash.Value, |                     Size = hash.Value, | ||||||
|                     Url = _configuration["CdnFullUrl"] + hash.Key.ToUpperInvariant() |                     Url = new Uri(cdnFullUri, hash.Key.ToUpperInvariant()).ToString() | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,10 +23,10 @@ namespace MareSynchronosServer.Hubs | |||||||
|         private readonly AuthService.AuthServiceClient _authServiceClient; |         private readonly AuthService.AuthServiceClient _authServiceClient; | ||||||
|         private readonly FileService.FileServiceClient _fileServiceClient; |         private readonly FileService.FileServiceClient _fileServiceClient; | ||||||
|         private readonly SystemInfoService _systemInfoService; |         private readonly SystemInfoService _systemInfoService; | ||||||
|         private readonly IConfiguration _configuration; |  | ||||||
|         private readonly IHttpContextAccessor contextAccessor; |         private readonly IHttpContextAccessor contextAccessor; | ||||||
|         private readonly ILogger<MareHub> _logger; |         private readonly ILogger<MareHub> _logger; | ||||||
|         private readonly MareDbContext _dbContext; |         private readonly MareDbContext _dbContext; | ||||||
|  |         private readonly Uri cdnFullUri; | ||||||
|         public MareHub(MetricsService.MetricsServiceClient metricsClient, AuthService.AuthServiceClient authServiceClient, FileService.FileServiceClient fileServiceClient, |         public MareHub(MetricsService.MetricsServiceClient metricsClient, AuthService.AuthServiceClient authServiceClient, FileService.FileServiceClient fileServiceClient, | ||||||
|             MareDbContext mareDbContext, ILogger<MareHub> logger, SystemInfoService systemInfoService, IConfiguration configuration, IHttpContextAccessor contextAccessor) |             MareDbContext mareDbContext, ILogger<MareHub> logger, SystemInfoService systemInfoService, IConfiguration configuration, IHttpContextAccessor contextAccessor) | ||||||
|         { |         { | ||||||
| @@ -34,7 +34,7 @@ namespace MareSynchronosServer.Hubs | |||||||
|             _authServiceClient = authServiceClient; |             _authServiceClient = authServiceClient; | ||||||
|             _fileServiceClient = fileServiceClient; |             _fileServiceClient = fileServiceClient; | ||||||
|             _systemInfoService = systemInfoService; |             _systemInfoService = systemInfoService; | ||||||
|             _configuration = configuration; |             cdnFullUri = new Uri(configuration.GetRequiredSection("MareSynchronos").GetValue<string>("CdnFullUrl")); | ||||||
|             this.contextAccessor = contextAccessor; |             this.contextAccessor = contextAccessor; | ||||||
|             _logger = logger; |             _logger = logger; | ||||||
|             _dbContext = mareDbContext; |             _dbContext = mareDbContext; | ||||||
|   | |||||||
| @@ -9,26 +9,14 @@ | |||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" /> |     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" /> | ||||||
|     <PackageReference Include="Bazinga.AspNetCore.Authentication.Basic" Version="2.0.1" /> |     <PackageReference Include="Bazinga.AspNetCore.Authentication.Basic" Version="2.0.1" /> | ||||||
|     <PackageReference Include="Ben.BlockingDetector" Version="0.0.4" /> |  | ||||||
|     <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> |     <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> | ||||||
|     <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> |     <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> | ||||||
|     <PackageReference Include="Grpc.Net.Client" Version="2.47.0" /> |     <PackageReference Include="Grpc.Net.Client" Version="2.47.0" /> | ||||||
|     <PackageReference Include="Karambolo.Extensions.Logging.File" Version="3.3.1" /> |     <PackageReference Include="Karambolo.Extensions.Logging.File" Version="3.3.1" /> | ||||||
|     <PackageReference Include="lz4net" Version="1.0.15.93" /> |     <PackageReference Include="lz4net" Version="1.0.15.93" /> | ||||||
|     <PackageReference Include="Meziantou.Analyzer" Version="1.0.715"> |  | ||||||
|       <PrivateAssets>all</PrivateAssets> |  | ||||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|     </PackageReference> |  | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="6.0.8" /> |     <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="6.0.8" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.8" /> |     <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.8" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.8" /> |  | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.8" /> |  | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8"> |  | ||||||
|       <PrivateAssets>all</PrivateAssets> |  | ||||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|     </PackageReference> |  | ||||||
|     <PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" /> |     <PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" /> | ||||||
|     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.6" /> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|   | |||||||
| @@ -12,7 +12,6 @@ using Microsoft.AspNetCore.Http.Connections; | |||||||
| using Microsoft.AspNetCore.SignalR; | using Microsoft.AspNetCore.SignalR; | ||||||
| using Microsoft.AspNetCore.Authorization; | using Microsoft.AspNetCore.Authorization; | ||||||
| using AspNetCoreRateLimit; | using AspNetCoreRateLimit; | ||||||
| using Ben.Diagnostics; |  | ||||||
| using MareSynchronosShared.Authentication; | using MareSynchronosShared.Authentication; | ||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
| @@ -45,17 +44,19 @@ namespace MareSynchronosServer | |||||||
|             services.AddSingleton<IUserIdProvider, IdBasedUserIdProvider>(); |             services.AddSingleton<IUserIdProvider, IdBasedUserIdProvider>(); | ||||||
|             services.AddTransient(_ => Configuration); |             services.AddTransient(_ => Configuration); | ||||||
|  |  | ||||||
|  |             var mareConfig = Configuration.GetRequiredSection("MareSynchronos"); | ||||||
|  |  | ||||||
|             services.AddGrpcClient<AuthService.AuthServiceClient>(c => |             services.AddGrpcClient<AuthService.AuthServiceClient>(c => | ||||||
|             { |             { | ||||||
|                 c.Address = new Uri(Configuration.GetValue<string>("ServiceAddress")); |                 c.Address = new Uri(mareConfig.GetValue<string>("ServiceAddress")); | ||||||
|             }); |             }); | ||||||
|             services.AddGrpcClient<MetricsService.MetricsServiceClient>(c => |             services.AddGrpcClient<MetricsService.MetricsServiceClient>(c => | ||||||
|             { |             { | ||||||
|                 c.Address = new Uri(Configuration.GetValue<string>("ServiceAddress")); |                 c.Address = new Uri(mareConfig.GetValue<string>("ServiceAddress")); | ||||||
|             }); |             }); | ||||||
|             services.AddGrpcClient<FileService.FileServiceClient>(c => |             services.AddGrpcClient<FileService.FileServiceClient>(c => | ||||||
|             { |             { | ||||||
|                 c.Address = new Uri(Configuration.GetValue<string>("StaticFileServiceAddress")); |                 c.Address = new Uri(mareConfig.GetValue<string>("StaticFileServiceAddress")); | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             services.AddDbContextPool<MareDbContext>(options => |             services.AddDbContextPool<MareDbContext>(options => | ||||||
| @@ -66,7 +67,7 @@ namespace MareSynchronosServer | |||||||
|                     builder.MigrationsAssembly("MareSynchronosShared"); |                     builder.MigrationsAssembly("MareSynchronosShared"); | ||||||
|                 }).UseSnakeCaseNamingConvention(); |                 }).UseSnakeCaseNamingConvention(); | ||||||
|                 options.EnableThreadSafetyChecks(false); |                 options.EnableThreadSafetyChecks(false); | ||||||
|             }, Configuration.GetValue("DbContextPoolSize", 1024)); |             }, mareConfig.GetValue("DbContextPoolSize", 1024)); | ||||||
|  |  | ||||||
|             services.AddHostedService(provider => provider.GetService<SystemInfoService>()); |             services.AddHostedService(provider => provider.GetService<SystemInfoService>()); | ||||||
|  |  | ||||||
| @@ -92,8 +93,6 @@ namespace MareSynchronosServer | |||||||
|         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. |         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | ||||||
|         public void Configure(IApplicationBuilder app, IWebHostEnvironment env) |         public void Configure(IApplicationBuilder app, IWebHostEnvironment env) | ||||||
|         { |         { | ||||||
|             app.UseBlockingDetection(); |  | ||||||
|  |  | ||||||
|             if (env.IsDevelopment()) |             if (env.IsDevelopment()) | ||||||
|             { |             { | ||||||
|                 app.UseDeveloperExceptionPage(); |                 app.UseDeveloperExceptionPage(); | ||||||
|   | |||||||
| @@ -23,10 +23,12 @@ | |||||||
|       ] |       ] | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  |   "MareSynchronos": { | ||||||
|     "DbContextPoolSize": 2000, |     "DbContextPoolSize": 2000, | ||||||
|     "CdnFullUrl": "https://<url or ip to your server>/cache/", |     "CdnFullUrl": "https://<url or ip to your server>/cache/", | ||||||
|     "ServiceAddress": "http://localhost:5002", |     "ServiceAddress": "http://localhost:5002", | ||||||
|   "StaticFileServiceAddress": "http://localhost:5001", |     "StaticFileServiceAddress": "http://localhost:5001" | ||||||
|  |   }, | ||||||
|   "AllowedHosts": "*", |   "AllowedHosts": "*", | ||||||
|   "Kestrel": { |   "Kestrel": { | ||||||
|     "Endpoints": { |     "Endpoints": { | ||||||
|   | |||||||
| @@ -1,4 +1,8 @@ | |||||||
| namespace MareSynchronosServices.Authentication; | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace MareSynchronosServices.Authentication; | ||||||
|  |  | ||||||
| public class FailedAuthorization : IDisposable | public class FailedAuthorization : IDisposable | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,10 +1,17 @@ | |||||||
| using System.Security.Cryptography; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Security.Cryptography; | ||||||
| using System.Text; | using System.Text; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
| using MareSynchronosServices.Metrics; | using MareSynchronosServices.Metrics; | ||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices.Authentication; | namespace MareSynchronosServices.Authentication; | ||||||
|  |  | ||||||
| @@ -17,8 +24,8 @@ public class SecretKeyAuthenticationHandler | |||||||
|     private readonly Dictionary<string, FailedAuthorization?> failedAuthorizations = new(); |     private readonly Dictionary<string, FailedAuthorization?> failedAuthorizations = new(); | ||||||
|     private readonly object authDictLock = new(); |     private readonly object authDictLock = new(); | ||||||
|     private readonly object failedAuthLock = new(); |     private readonly object failedAuthLock = new(); | ||||||
|     private readonly int failedAttemptsForTempBan; |     private readonly int _failedAttemptsForTempBan; | ||||||
|     private readonly int tempBanMinutes; |     private readonly int _tempBanMinutes; | ||||||
|  |  | ||||||
|     public void ClearUnauthorizedUsers() |     public void ClearUnauthorizedUsers() | ||||||
|     { |     { | ||||||
| @@ -58,7 +65,7 @@ public class SecretKeyAuthenticationHandler | |||||||
|  |  | ||||||
|         lock (failedAuthLock) |         lock (failedAuthLock) | ||||||
|         { |         { | ||||||
|             if (failedAuthorizations.TryGetValue(ip, out var existingFailedAuthorization) && existingFailedAuthorization.FailedAttempts > failedAttemptsForTempBan) |             if (failedAuthorizations.TryGetValue(ip, out var existingFailedAuthorization) && existingFailedAuthorization.FailedAttempts > _failedAttemptsForTempBan) | ||||||
|             { |             { | ||||||
|                 metrics.IncCounter(MetricsAPI.CounterAuthenticationFailures); |                 metrics.IncCounter(MetricsAPI.CounterAuthenticationFailures); | ||||||
|  |  | ||||||
| @@ -68,7 +75,7 @@ public class SecretKeyAuthenticationHandler | |||||||
|                 var token = existingFailedAuthorization.ResetCts.Token; |                 var token = existingFailedAuthorization.ResetCts.Token; | ||||||
|                 existingFailedAuthorization.ResetTask = Task.Run(async () => |                 existingFailedAuthorization.ResetTask = Task.Run(async () => | ||||||
|                 { |                 { | ||||||
|                     await Task.Delay(TimeSpan.FromMinutes(tempBanMinutes), token).ConfigureAwait(false); |                     await Task.Delay(TimeSpan.FromMinutes(_tempBanMinutes), token).ConfigureAwait(false); | ||||||
|                     if (token.IsCancellationRequested) return; |                     if (token.IsCancellationRequested) return; | ||||||
|                     FailedAuthorization? failedAuthorization; |                     FailedAuthorization? failedAuthorization; | ||||||
|                     lock (failedAuthLock) |                     lock (failedAuthLock) | ||||||
| @@ -159,7 +166,8 @@ public class SecretKeyAuthenticationHandler | |||||||
|     { |     { | ||||||
|         this.logger = logger; |         this.logger = logger; | ||||||
|         this.metrics = metrics; |         this.metrics = metrics; | ||||||
|         failedAttemptsForTempBan = configuration.GetValue<int>("FailedAuthForTempBan", 5); |         var config = configuration.GetRequiredSection("MareSynchronos"); | ||||||
|         tempBanMinutes = configuration.GetValue<int>("TempBanDurationInMinutes", 30); |         _failedAttemptsForTempBan = config.GetValue<int>("FailedAuthForTempBan", 5); | ||||||
|  |         _tempBanMinutes = config.GetValue<int>("TempBanDurationInMinutes", 30); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -3,9 +3,17 @@ using MareSynchronosServices.Metrics; | |||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
| using MareSynchronosShared.Models; | using MareSynchronosShared.Models; | ||||||
| using MareSynchronosShared.Protos; |  | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using MetricsService = MareSynchronosShared.Protos.MetricsService; | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  | using Microsoft.Extensions.Hosting; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices | namespace MareSynchronosServices | ||||||
| { | { | ||||||
| @@ -16,7 +24,7 @@ namespace MareSynchronosServices | |||||||
|         private readonly ILogger<CleanupService> _logger; |         private readonly ILogger<CleanupService> _logger; | ||||||
|         private readonly IServiceProvider _services; |         private readonly IServiceProvider _services; | ||||||
|         private readonly IConfiguration _configuration; |         private readonly IConfiguration _configuration; | ||||||
|         private Timer _timer; |         private Timer? _timer; | ||||||
|  |  | ||||||
|         public CleanupService(MareMetrics metrics, SecretKeyAuthenticationHandler authService, ILogger<CleanupService> logger, IServiceProvider services, IConfiguration configuration) |         public CleanupService(MareMetrics metrics, SecretKeyAuthenticationHandler authService, ILogger<CleanupService> logger, IServiceProvider services, IConfiguration configuration) | ||||||
|         { |         { | ||||||
| @@ -24,7 +32,7 @@ namespace MareSynchronosServices | |||||||
|             _authService = authService; |             _authService = authService; | ||||||
|             _logger = logger; |             _logger = logger; | ||||||
|             _services = services; |             _services = services; | ||||||
|             _configuration = configuration; |             _configuration = configuration.GetRequiredSection("MareSynchronos"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public Task StartAsync(CancellationToken cancellationToken) |         public Task StartAsync(CancellationToken cancellationToken) | ||||||
| @@ -158,7 +166,7 @@ namespace MareSynchronosServices | |||||||
|  |  | ||||||
|                     foreach (var user in usersToRemove) |                     foreach (var user in usersToRemove) | ||||||
|                     { |                     { | ||||||
|                         PurgeUser(user, dbContext, _configuration); |                         PurgeUser(user, dbContext); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -176,7 +184,7 @@ namespace MareSynchronosServices | |||||||
|             dbContext.SaveChanges(); |             dbContext.SaveChanges(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void PurgeUser(User user, MareDbContext dbContext, IConfiguration _configuration) |         public void PurgeUser(User user, MareDbContext dbContext) | ||||||
|         { |         { | ||||||
|             var lodestone = dbContext.LodeStoneAuth.SingleOrDefault(a => a.User.UID == user.UID); |             var lodestone = dbContext.LodeStoneAuth.SingleOrDefault(a => a.User.UID == user.UID); | ||||||
|  |  | ||||||
| @@ -190,17 +198,6 @@ namespace MareSynchronosServices | |||||||
|             var auth = dbContext.Auth.Single(a => a.UserUID == user.UID); |             var auth = dbContext.Auth.Single(a => a.UserUID == user.UID); | ||||||
|  |  | ||||||
|             var userFiles = dbContext.Files.Where(f => f.Uploaded && f.Uploader.UID == user.UID).ToList(); |             var userFiles = dbContext.Files.Where(f => f.Uploaded && f.Uploader.UID == user.UID).ToList(); | ||||||
|             foreach (var file in userFiles) |  | ||||||
|             { |  | ||||||
|                 var fi = new FileInfo(Path.Combine(_configuration["CacheDirectory"], file.Hash)); |  | ||||||
|                 if (fi.Exists) |  | ||||||
|                 { |  | ||||||
|                     metrics.DecGaugeBy(MetricsAPI.GaugeFilesTotalSize, fi.Length); |  | ||||||
|                     metrics.DecGaugeBy(MetricsAPI.GaugeFilesTotal, 1); |  | ||||||
|                     fi.Delete(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             dbContext.Files.RemoveRange(userFiles); |             dbContext.Files.RemoveRange(userFiles); | ||||||
|  |  | ||||||
|             var ownPairData = dbContext.ClientPairs.Where(u => u.User.UID == user.UID).ToList(); |             var ownPairData = dbContext.ClientPairs.Where(u => u.User.UID == user.UID).ToList(); | ||||||
|   | |||||||
| @@ -1,7 +1,12 @@ | |||||||
| using System.Collections.Concurrent; | using System; | ||||||
|  | using System.Collections.Concurrent; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Net.Http; | ||||||
| using System.Security.Cryptography; | using System.Security.Cryptography; | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
| using Discord; | using Discord; | ||||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||||
| using MareSynchronosServices.Metrics; | using MareSynchronosServices.Metrics; | ||||||
| @@ -9,6 +14,10 @@ using MareSynchronosShared.Data; | |||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
| using MareSynchronosShared.Models; | using MareSynchronosShared.Models; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  | using Microsoft.Extensions.Hosting; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices.Discord; | namespace MareSynchronosServices.Discord; | ||||||
|  |  | ||||||
| @@ -17,14 +26,14 @@ public class DiscordBot : IHostedService | |||||||
|     private readonly CleanupService cleanupService; |     private readonly CleanupService cleanupService; | ||||||
|     private readonly MareMetrics metrics; |     private readonly MareMetrics metrics; | ||||||
|     private readonly IServiceProvider services; |     private readonly IServiceProvider services; | ||||||
|     private readonly IConfiguration configuration; |     private readonly IConfiguration _configuration; | ||||||
|     private readonly ILogger<DiscordBot> logger; |     private readonly ILogger<DiscordBot> logger; | ||||||
|     private readonly Random random; |     private readonly Random random; | ||||||
|     private string authToken = string.Empty; |     private string authToken = string.Empty; | ||||||
|     DiscordSocketClient discordClient; |     DiscordSocketClient discordClient; | ||||||
|     ConcurrentDictionary<ulong, string> DiscordLodestoneMapping = new(); |     ConcurrentDictionary<ulong, string> DiscordLodestoneMapping = new(); | ||||||
|     private CancellationTokenSource verificationTaskCts; |     private CancellationTokenSource? verificationTaskCts; | ||||||
|     private CancellationTokenSource updateStatusCts; |     private CancellationTokenSource? updateStatusCts; | ||||||
|     private readonly string[] LodestoneServers = new[] { "eu", "na", "jp", "fr", "de" }; |     private readonly string[] LodestoneServers = new[] { "eu", "na", "jp", "fr", "de" }; | ||||||
|     private readonly ConcurrentQueue<SocketSlashCommand> verificationQueue = new(); |     private readonly ConcurrentQueue<SocketSlashCommand> verificationQueue = new(); | ||||||
|  |  | ||||||
| @@ -35,13 +44,13 @@ public class DiscordBot : IHostedService | |||||||
|         this.cleanupService = cleanupService; |         this.cleanupService = cleanupService; | ||||||
|         this.metrics = metrics; |         this.metrics = metrics; | ||||||
|         this.services = services; |         this.services = services; | ||||||
|         this.configuration = configuration; |         _configuration = configuration.GetRequiredSection("MareSynchronos"); | ||||||
|         this.logger = logger; |         this.logger = logger; | ||||||
|         this.verificationQueue = new ConcurrentQueue<SocketSlashCommand>(); |         this.verificationQueue = new ConcurrentQueue<SocketSlashCommand>(); | ||||||
|         this.semaphore = new SemaphoreSlim(1); |         this.semaphore = new SemaphoreSlim(1); | ||||||
|  |  | ||||||
|         random = new(); |         random = new(); | ||||||
|         authToken = configuration.GetValue<string>("DiscordBotToken"); |         authToken = _configuration.GetValue<string>("DiscordBotToken"); | ||||||
|  |  | ||||||
|         discordClient = new(new DiscordSocketConfig() |         discordClient = new(new DiscordSocketConfig() | ||||||
|         { |         { | ||||||
| @@ -110,7 +119,7 @@ public class DiscordBot : IHostedService | |||||||
|         { |         { | ||||||
|             if (discordAuthedUser.User != null) |             if (discordAuthedUser.User != null) | ||||||
|             { |             { | ||||||
|                 cleanupService.PurgeUser(discordAuthedUser.User, db, configuration); |                 cleanupService.PurgeUser(discordAuthedUser.User, db); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
| @@ -168,9 +177,9 @@ public class DiscordBot : IHostedService | |||||||
|                         user.IsAdmin = true; |                         user.IsAdmin = true; | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     if (configuration.GetValue<bool>("PurgeUnusedAccounts")) |                     if (_configuration.GetValue<bool>("PurgeUnusedAccounts")) | ||||||
|                     { |                     { | ||||||
|                         var purgedDays = configuration.GetValue<int>("PurgeUnusedAccountsPeriodInDays"); |                         var purgedDays = _configuration.GetValue<int>("PurgeUnusedAccountsPeriodInDays"); | ||||||
|                         user.LastLoggedIn = DateTime.UtcNow - TimeSpan.FromDays(purgedDays) + TimeSpan.FromDays(1); |                         user.LastLoggedIn = DateTime.UtcNow - TimeSpan.FromDays(purgedDays) + TimeSpan.FromDays(1); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
| @@ -360,7 +369,7 @@ public class DiscordBot : IHostedService | |||||||
|     { |     { | ||||||
|         if (!string.IsNullOrEmpty(authToken)) |         if (!string.IsNullOrEmpty(authToken)) | ||||||
|         { |         { | ||||||
|             authToken = configuration.GetValue<string>("DiscordBotToken"); |             authToken = _configuration.GetValue<string>("DiscordBotToken"); | ||||||
|  |  | ||||||
|             await discordClient.LoginAsync(TokenType.Bot, authToken).ConfigureAwait(false); |             await discordClient.LoginAsync(TokenType.Bot, authToken).ConfigureAwait(false); | ||||||
|             await discordClient.StartAsync().ConfigureAwait(false); |             await discordClient.StartAsync().ConfigureAwait(false); | ||||||
| @@ -423,7 +432,7 @@ public class DiscordBot : IHostedService | |||||||
|         await discordClient.StopAsync().ConfigureAwait(false); |         await discordClient.StopAsync().ConfigureAwait(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static string GenerateRandomString(int length, string allowableChars = null) |     public static string GenerateRandomString(int length, string? allowableChars = null) | ||||||
|     { |     { | ||||||
|         if (string.IsNullOrEmpty(allowableChars)) |         if (string.IsNullOrEmpty(allowableChars)) | ||||||
|             allowableChars = @"ABCDEFGHJKLMNPQRSTUVWXYZ0123456789"; |             allowableChars = @"ABCDEFGHJKLMNPQRSTUVWXYZ0123456789"; | ||||||
|   | |||||||
| @@ -2,21 +2,13 @@ | |||||||
|  |  | ||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <TargetFramework>net6.0</TargetFramework> |     <TargetFramework>net6.0</TargetFramework> | ||||||
|     <Nullable>enable</Nullable> |  | ||||||
|     <ImplicitUsings>enable</ImplicitUsings> |  | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="Discord.Net" Version="3.7.2" /> |     <PackageReference Include="Discord.Net" Version="3.7.2" /> | ||||||
|     <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> |     <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> | ||||||
|     <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> |     <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.8" /> |  | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8"> |  | ||||||
|       <PrivateAssets>all</PrivateAssets> |  | ||||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|     </PackageReference> |  | ||||||
|     <PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" /> |     <PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" /> | ||||||
|     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.6" /> |  | ||||||
|     <PackageReference Include="prometheus-net.AspNetCore" Version="6.0.0" /> |     <PackageReference Include="prometheus-net.AspNetCore" Version="6.0.0" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,11 @@ | |||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
| using Prometheus; | using Prometheus; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices.Metrics; | namespace MareSynchronosServices.Metrics; | ||||||
|  |  | ||||||
| @@ -16,7 +20,6 @@ public class MareMetrics | |||||||
|         gauges[MetricsAPI.GaugePairs].IncTo(dbContext.ClientPairs.Count()); |         gauges[MetricsAPI.GaugePairs].IncTo(dbContext.ClientPairs.Count()); | ||||||
|         gauges[MetricsAPI.GaugePairsPaused].IncTo(dbContext.ClientPairs.Count(p => p.IsPaused)); |         gauges[MetricsAPI.GaugePairsPaused].IncTo(dbContext.ClientPairs.Count(p => p.IsPaused)); | ||||||
|         gauges[MetricsAPI.GaugeFilesTotal].IncTo(dbContext.Files.Count()); |         gauges[MetricsAPI.GaugeFilesTotal].IncTo(dbContext.Files.Count()); | ||||||
|         gauges[MetricsAPI.GaugeFilesTotalSize].IncTo(Directory.EnumerateFiles(configuration["CacheDirectory"]).Sum(f => new FileInfo(f).Length)); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private readonly Dictionary<string, Counter> counters = new() |     private readonly Dictionary<string, Counter> counters = new() | ||||||
|   | |||||||
| @@ -1,4 +1,7 @@ | |||||||
| using MareSynchronosServices; | using MareSynchronosServices; | ||||||
|  | using Microsoft.AspNetCore.Hosting; | ||||||
|  | using Microsoft.Extensions.Hosting; | ||||||
|  | using System; | ||||||
|  |  | ||||||
| public class Program | public class Program | ||||||
| { | { | ||||||
|   | |||||||
| @@ -2,6 +2,8 @@ using Grpc.Core; | |||||||
| using MareSynchronosServices.Authentication; | using MareSynchronosServices.Authentication; | ||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices.Services | namespace MareSynchronosServices.Services | ||||||
| { | { | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| using Grpc.Core; | using Grpc.Core; | ||||||
| using MareSynchronosServices.Metrics; | using MareSynchronosServices.Metrics; | ||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices.Services; | namespace MareSynchronosServices.Services; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,11 @@ using MareSynchronosServices.Metrics; | |||||||
| using MareSynchronosServices.Services; | using MareSynchronosServices.Services; | ||||||
| using MareSynchronosShared.Authentication; | using MareSynchronosShared.Authentication; | ||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
|  | using Microsoft.AspNetCore.Builder; | ||||||
|  | using Microsoft.AspNetCore.Hosting; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
| using Prometheus; | using Prometheus; | ||||||
|  |  | ||||||
| namespace MareSynchronosServices; | namespace MareSynchronosServices; | ||||||
|   | |||||||
| @@ -16,12 +16,13 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  |   "MareSynchronos": { | ||||||
|     "DbContextPoolSize": 1024, |     "DbContextPoolSize": 1024, | ||||||
|     "DiscordBotToken": "", |     "DiscordBotToken": "", | ||||||
|     "PurgeUnusedAccounts": true, |     "PurgeUnusedAccounts": true, | ||||||
|     "PurgeUnusedAccountsPeriodInDays": 14, |     "PurgeUnusedAccountsPeriodInDays": 14, | ||||||
|   "CacheDirectory": "G:\\ServerTest", // do not delete this key and set it to the path where the files will be stored |  | ||||||
|     "FailedAuthForTempBan": 5, |     "FailedAuthForTempBan": 5, | ||||||
|   "TempBanDurationInMinutes": 30, |     "TempBanDurationInMinutes": 30 | ||||||
|  |   }, | ||||||
|   "AllowedHosts": "*" |   "AllowedHosts": "*" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| <Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<TargetFramework>net6.0</TargetFramework> | 		<TargetFramework>net6.0</TargetFramework> | ||||||
| @@ -16,6 +16,10 @@ | |||||||
| 	<ItemGroup> | 	<ItemGroup> | ||||||
| 		<PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> | 		<PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> | ||||||
| 		<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> | 		<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" /> | ||||||
|  | 		<PackageReference Include="Meziantou.Analyzer" Version="1.0.717"> | ||||||
|  | 		  <PrivateAssets>all</PrivateAssets> | ||||||
|  | 		  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  | 		</PackageReference> | ||||||
| 	</ItemGroup> | 	</ItemGroup> | ||||||
|  |  | ||||||
| 	<ItemGroup> | 	<ItemGroup> | ||||||
|   | |||||||
| @@ -1,5 +1,15 @@ | |||||||
| using MareSynchronosShared.Data; | using MareSynchronosShared.Data; | ||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  | using Microsoft.Extensions.Hosting; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
| using static MareSynchronosShared.Protos.MetricsService; | using static MareSynchronosShared.Protos.MetricsService; | ||||||
|  |  | ||||||
| namespace MareSynchronosStaticFilesServer; | namespace MareSynchronosStaticFilesServer; | ||||||
| @@ -17,7 +27,12 @@ public class CleanupService : IHostedService, IDisposable | |||||||
|         _metrics = metrics; |         _metrics = metrics; | ||||||
|         _logger = logger; |         _logger = logger; | ||||||
|         _services = services; |         _services = services; | ||||||
|         _configuration = configuration; |         _configuration = configuration.GetRequiredSection("MareSynchronos"); | ||||||
|  |         metrics.SetGauge(new MareSynchronosShared.Protos.SetGaugeRequest() | ||||||
|  |         { | ||||||
|  |             GaugeName = MetricsAPI.GaugeFilesTotalSize, | ||||||
|  |             Value = Directory.EnumerateFiles(_configuration["CacheDirectory"]).Sum(f => new FileInfo(f).Length) | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Task StartAsync(CancellationToken cancellationToken) |     public Task StartAsync(CancellationToken cancellationToken) | ||||||
| @@ -65,6 +80,16 @@ public class CleanupService : IHostedService, IDisposable | |||||||
|                     fi.Delete(); |                     fi.Delete(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             foreach (var file in Directory.EnumerateFiles(cachedir).ToList()) | ||||||
|  |             { | ||||||
|  |                 FileInfo fi = new(file); | ||||||
|  |                 if (!allFiles.Any(f => f.Hash == fi.Name.ToUpperInvariant())) | ||||||
|  |                 { | ||||||
|  |                     fi.Delete(); | ||||||
|  |                     _logger.LogInformation("File not in DB, deleting: {fileName}", fi.FullName); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         catch (Exception ex) |         catch (Exception ex) | ||||||
|         { |         { | ||||||
| @@ -78,7 +103,8 @@ public class CleanupService : IHostedService, IDisposable | |||||||
|             if (cacheSizeLimitInGiB > 0) |             if (cacheSizeLimitInGiB > 0) | ||||||
|             { |             { | ||||||
|                 _logger.LogInformation("Cleaning up files beyond the cache size limit"); |                 _logger.LogInformation("Cleaning up files beyond the cache size limit"); | ||||||
|                 var allLocalFiles = Directory.EnumerateFiles(_configuration["CacheDirectory"]).Select(f => new FileInfo(f)).ToList().OrderBy(f => f.LastAccessTimeUtc).ToList(); |                 var allLocalFiles = Directory.EnumerateFiles(_configuration["CacheDirectory"]) | ||||||
|  |                     .Select(f => new FileInfo(f)).ToList().OrderBy(f => f.LastAccessTimeUtc).ToList(); | ||||||
|                 var totalCacheSizeInBytes = allLocalFiles.Sum(s => s.Length); |                 var totalCacheSizeInBytes = allLocalFiles.Sum(s => s.Length); | ||||||
|                 long cacheSizeLimitInBytes = (long)(cacheSizeLimitInGiB * 1024 * 1024 * 1024); |                 long cacheSizeLimitInBytes = (long)(cacheSizeLimitInGiB * 1024 * 1024 * 1024); | ||||||
|                 HashSet<string> removedHashes = new(); |                 HashSet<string> removedHashes = new(); | ||||||
|   | |||||||
| @@ -3,7 +3,13 @@ using MareSynchronosShared.Data; | |||||||
| using MareSynchronosShared.Metrics; | using MareSynchronosShared.Metrics; | ||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using System; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
| using System.Security.Policy; | using System.Security.Policy; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| namespace MareSynchronosStaticFilesServer; | namespace MareSynchronosStaticFilesServer; | ||||||
|  |  | ||||||
| @@ -16,7 +22,7 @@ public class FileService : MareSynchronosShared.Protos.FileService.FileServiceBa | |||||||
|  |  | ||||||
|     public FileService(MareDbContext mareDbContext, IConfiguration configuration, ILogger<FileService> logger, MetricsService.MetricsServiceClient metricsClient) |     public FileService(MareDbContext mareDbContext, IConfiguration configuration, ILogger<FileService> logger, MetricsService.MetricsServiceClient metricsClient) | ||||||
|     { |     { | ||||||
|         _basePath = configuration["CacheDirectory"]; |         _basePath = configuration.GetRequiredSection("MareSynchronos")["CacheDirectory"]; | ||||||
|         _mareDbContext = mareDbContext; |         _mareDbContext = mareDbContext; | ||||||
|         _logger = logger; |         _logger = logger; | ||||||
|         _metricsClient = metricsClient; |         _metricsClient = metricsClient; | ||||||
|   | |||||||
| @@ -2,8 +2,6 @@ | |||||||
|  |  | ||||||
|   <PropertyGroup> |   <PropertyGroup> | ||||||
|     <TargetFramework>net6.0</TargetFramework> |     <TargetFramework>net6.0</TargetFramework> | ||||||
|     <Nullable>enable</Nullable> |  | ||||||
|     <ImplicitUsings>enable</ImplicitUsings> |  | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| using Microsoft.AspNetCore.Http.Connections; | using Microsoft.AspNetCore.Hosting; | ||||||
| using Microsoft.AspNetCore.SignalR; | using Microsoft.Extensions.Hosting; | ||||||
|  | using System; | ||||||
|  |  | ||||||
| namespace MareSynchronosStaticFilesServer; | namespace MareSynchronosStaticFilesServer; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,8 +3,13 @@ using MareSynchronosShared.Data; | |||||||
| using MareSynchronosShared.Protos; | using MareSynchronosShared.Protos; | ||||||
| using Microsoft.AspNetCore.Authentication; | using Microsoft.AspNetCore.Authentication; | ||||||
| using Microsoft.AspNetCore.Authorization; | using Microsoft.AspNetCore.Authorization; | ||||||
|  | using Microsoft.AspNetCore.Builder; | ||||||
|  | using Microsoft.AspNetCore.Hosting; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
| using Microsoft.Extensions.FileProviders; | using Microsoft.Extensions.FileProviders; | ||||||
|  | using System; | ||||||
|  |  | ||||||
| namespace MareSynchronosStaticFilesServer; | namespace MareSynchronosStaticFilesServer; | ||||||
|  |  | ||||||
| @@ -23,13 +28,15 @@ public class Startup | |||||||
|  |  | ||||||
|         services.AddTransient(_ => Configuration); |         services.AddTransient(_ => Configuration); | ||||||
|  |  | ||||||
|  |         var mareSettings = Configuration.GetRequiredSection("MareSynchronos"); | ||||||
|  |  | ||||||
|         services.AddGrpcClient<AuthService.AuthServiceClient>(c => |         services.AddGrpcClient<AuthService.AuthServiceClient>(c => | ||||||
|         { |         { | ||||||
|             c.Address = new Uri(Configuration.GetValue<string>("ServiceAddress")); |             c.Address = new Uri(mareSettings.GetValue<string>("ServiceAddress")); | ||||||
|         }); |         }); | ||||||
|         services.AddGrpcClient<MetricsService.MetricsServiceClient>(c => |         services.AddGrpcClient<MetricsService.MetricsServiceClient>(c => | ||||||
|         { |         { | ||||||
|             c.Address = new Uri(Configuration.GetValue<string>("ServiceAddress")); |             c.Address = new Uri(mareSettings.GetValue<string>("ServiceAddress")); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         services.AddDbContextPool<MareDbContext>(options => |         services.AddDbContextPool<MareDbContext>(options => | ||||||
| @@ -39,7 +46,7 @@ public class Startup | |||||||
|                 builder.MigrationsHistoryTable("_efmigrationshistory", "public"); |                 builder.MigrationsHistoryTable("_efmigrationshistory", "public"); | ||||||
|             }).UseSnakeCaseNamingConvention(); |             }).UseSnakeCaseNamingConvention(); | ||||||
|             options.EnableThreadSafetyChecks(false); |             options.EnableThreadSafetyChecks(false); | ||||||
|         }, Configuration.GetValue("DbContextPoolSize", 1024)); |         }, mareSettings.GetValue("DbContextPoolSize", 1024)); | ||||||
|  |  | ||||||
|         services.AddAuthentication(options => |         services.AddAuthentication(options => | ||||||
|             { |             { | ||||||
| @@ -66,7 +73,7 @@ public class Startup | |||||||
|  |  | ||||||
|         app.UseStaticFiles(new StaticFileOptions() |         app.UseStaticFiles(new StaticFileOptions() | ||||||
|         { |         { | ||||||
|             FileProvider = new PhysicalFileProvider(Configuration["CacheDirectory"]), |             FileProvider = new PhysicalFileProvider(Configuration.GetRequiredSection("MareSynchronos")["CacheDirectory"]), | ||||||
|             RequestPath = "/cache", |             RequestPath = "/cache", | ||||||
|             ServeUnknownFileTypes = true |             ServeUnknownFileTypes = true | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -1,4 +1,7 @@ | |||||||
| { | { | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     "DefaultConnection": "Host=localhost;Port=5432;Database=mare;Username=postgres" | ||||||
|  |   }, | ||||||
|   "Logging": { |   "Logging": { | ||||||
|     "LogLevel": { |     "LogLevel": { | ||||||
|       "Default": "Information", |       "Default": "Information", | ||||||
| @@ -12,9 +15,11 @@ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  |   "MareSynchronos": { | ||||||
|     "CacheSizeHardLimitInGiB": -1, |     "CacheSizeHardLimitInGiB": -1, | ||||||
|     "UnusedFileRetentionPeriodInDays": 7, |     "UnusedFileRetentionPeriodInDays": 7, | ||||||
|   "AllowedHosts": "*", |  | ||||||
|     "CacheDirectory": "G:\\ServerTest", // do not delete this key and set it to the path where the files will be stored |     "CacheDirectory": "G:\\ServerTest", // do not delete this key and set it to the path where the files will be stored | ||||||
|     "ServiceAddress": "http://localhost:5002" |     "ServiceAddress": "http://localhost:5002" | ||||||
|  |   }, | ||||||
|  |   "AllowedHosts": "*" | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant