From ab55d1f75dc8b1149df7643606a94243aebb71a0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 30 Dec 2019 20:58:29 -0500 Subject: [PATCH] Post package upgrade fixes --- src/Tgstation.Server.Host.Console/Program.cs | 7 ++- .../Tgstation.Server.Host.Console.csproj | 2 +- src/Tgstation.Server.Host.Service/Program.cs | 16 ++----- .../ServerService.cs | 43 ++++++++----------- .../Tgstation.Server.Host.Service.csproj | 2 +- .../Tgstation.Server.Host.Watchdog.csproj | 2 +- .../Controllers/ApiController.cs | 1 - src/Tgstation.Server.Host/Core/Application.cs | 19 ++++---- src/Tgstation.Server.Host/Core/SetupWizard.cs | 11 +++-- .../MySqlDesignTimeDbContextFactory.cs | 2 +- .../SqlServerDesignTimeDbContextFactory.cs | 2 +- .../Tgstation.Server.Host.csproj | 14 +++--- .../Tgstation.Server.Api.Tests.csproj | 4 +- .../Tgstation.Server.Client.Tests.csproj | 4 +- ...Tgstation.Server.Host.Console.Tests.csproj | 4 +- .../TestServerService.cs | 35 ++++++--------- .../Core/TestSetupWizard.cs | 12 +++++- .../Tgstation.Server.Host.Tests.csproj | 2 +- ...gstation.Server.Host.Watchdog.Tests.csproj | 4 +- .../Tgstation.Server.Tests/IntegrationTest.cs | 2 +- .../Tgstation.Server.Tests.csproj | 4 +- 21 files changed, 93 insertions(+), 99 deletions(-) diff --git a/src/Tgstation.Server.Host.Console/Program.cs b/src/Tgstation.Server.Host.Console/Program.cs index 88dddf9abe..54cdad151b 100644 --- a/src/Tgstation.Server.Host.Console/Program.cs +++ b/src/Tgstation.Server.Host.Console/Program.cs @@ -24,13 +24,16 @@ namespace Tgstation.Server.Host.Console /// A representing the running operation internal static async Task Main(string[] args) { - using (var loggerFactory = LoggerFactory.Create( - builder => builder.AddConsole())) + using (var loggerFactory = new LoggerFactory()) { var arguments = new List(args); var trace = arguments.Remove("--trace-host-watchdog"); var debug = arguments.Remove("--debug-host-watchdog"); +#pragma warning disable CS0618 // Type or member is obsolete + loggerFactory.AddConsole(trace ? LogLevel.Trace : debug ? LogLevel.Debug : LogLevel.Information, true); +#pragma warning restore CS0618 // Type or member is obsolete + if (trace && debug) { loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!"); diff --git a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj index 2af9fc7bd2..86cbf78c30 100644 --- a/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj +++ b/src/Tgstation.Server.Host.Console/Tgstation.Server.Host.Console.csproj @@ -27,7 +27,7 @@ all compile; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host.Service/Program.cs b/src/Tgstation.Server.Host.Service/Program.cs index 4d9b81d8cc..1ec0f9eae2 100644 --- a/src/Tgstation.Server.Host.Service/Program.cs +++ b/src/Tgstation.Server.Host.Service/Program.cs @@ -108,18 +108,7 @@ namespace Tgstation.Server.Host.Service } } - bool serviceWillRun = !Configure && !Install && !Uninstall; - ServerService service = null; - ILoggerFactory loggerFactory = null; - using (loggerFactory = LoggerFactory.Create(builder => - { - if (serviceWillRun) - { - LogLevel logLevel = Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information; - service = new ServerService(WatchdogFactory, builder, () => loggerFactory, logLevel); - } - })) - using(service) + using (var loggerFactory = new LoggerFactory()) { if (Configure) await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty(), default).ConfigureAwait(false); @@ -153,7 +142,8 @@ namespace Tgstation.Server.Host.Service installer.ServiceName = ServerService.Name; installer.Uninstall(null); } - else if (serviceWillRun) + else if (!Configure) + using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information)) ServiceBase.Run(service); } } diff --git a/src/Tgstation.Server.Host.Service/ServerService.cs b/src/Tgstation.Server.Host.Service/ServerService.cs index 42bb08041f..f94ed5fdcb 100644 --- a/src/Tgstation.Server.Host.Service/ServerService.cs +++ b/src/Tgstation.Server.Host.Service/ServerService.cs @@ -21,17 +21,12 @@ namespace Tgstation.Server.Host.Service public const string Name = "tgstation-server-4"; /// - /// The for the + /// The for the /// - readonly IWatchdogFactory watchdogFactory; + readonly IWatchdog watchdog; /// - /// The used to retrieve a configured . - /// - readonly Func getLoggerFactory; - - /// - /// The recieved from . + /// The recieved from of /// Task watchdogTask; @@ -43,39 +38,39 @@ namespace Tgstation.Server.Host.Service /// /// Construct a /// - /// The value of . - /// The to configure. - /// The used to retrieve a based on the configuration. + /// The to create with + /// The for /// The minimum to record in the event log - public ServerService(IWatchdogFactory watchdogFactory, ILoggingBuilder loggingBuilder, Func getLoggerFactory, LogLevel minumumLogLevel) + public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel) { - this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory)); - if (loggingBuilder == null) - throw new ArgumentNullException(nameof(loggingBuilder)); - this.getLoggerFactory = getLoggerFactory ?? throw new ArgumentNullException(nameof(getLoggerFactory)); + if (watchdogFactory == null) + throw new ArgumentNullException(nameof(watchdogFactory)); + if (loggerFactory == null) + throw new ArgumentNullException(nameof(loggerFactory)); - ServiceName = Name; - - loggingBuilder.AddEventLog(new EventLogSettings +#pragma warning disable CS0618 // Type or member is obsolete + loggerFactory.AddEventLog(new EventLogSettings { LogName = EventLog.Log, MachineName = EventLog.MachineName, SourceName = EventLog.Source, Filter = (message, logLevel) => logLevel >= minumumLogLevel }); +#pragma warning restore CS0618 // Type or member is obsolete + + ServiceName = Name; + watchdog = watchdogFactory.CreateWatchdog(loggerFactory); } /// - /// Creates and executes the watchdog stopping the service if it exits + /// Executes the , stopping the service if it exits /// - /// The arguments for the watchdog. + /// The arguments for the /// The for the operation /// A representing the running operation async Task RunWatchdog(string[] args, CancellationToken cancellationToken) { - var watchdog = watchdogFactory.CreateWatchdog(getLoggerFactory()); - - await watchdog.RunAsync(false, args, cancellationToken).ConfigureAwait(false); + await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false); void StopServiceAsync() { diff --git a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj index 626248bcdf..479e6d6b87 100644 --- a/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj +++ b/src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj @@ -28,7 +28,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 38cce74426..b25f01246a 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -27,7 +27,7 @@ all compile; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Tgstation.Server.Host/Controllers/ApiController.cs b/src/Tgstation.Server.Host/Controllers/ApiController.cs index f937018e41..9565072343 100644 --- a/src/Tgstation.Server.Host/Controllers/ApiController.cs +++ b/src/Tgstation.Server.Host/Controllers/ApiController.cs @@ -18,7 +18,6 @@ namespace Tgstation.Server.Host.Controllers /// A for API functions /// [Produces(ApiHeaders.ApplicationJson)] - [Consumes(ApiHeaders.ApplicationJson)] public abstract class ApiController : Controller { /// diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs index fa37e32823..4f5438ca5f 100644 --- a/src/Tgstation.Server.Host/Core/Application.cs +++ b/src/Tgstation.Server.Host/Core/Application.cs @@ -104,6 +104,9 @@ namespace Tgstation.Server.Host.Core // enable options which give us config reloading services.AddOptions(); + // this is needful for the setup wizard + services.AddLogging(); + // other stuff needed for for setup wizard and configuration services.AddSingleton(); services.AddSingleton(); @@ -231,9 +234,8 @@ namespace Tgstation.Server.Host.Core // enable browser detection services.AddDetectionCore().AddBrowser(); - // enable CORS if necessary - if (controlPanelConfiguration.AllowAnyOrigin || controlPanelConfiguration.AllowedOrigins?.Count > 0) - services.AddCors(); + // CORS conditionally enabled later + services.AddCors(); void AddTypedContext() where TContext : DatabaseContext { @@ -369,12 +371,13 @@ namespace Tgstation.Server.Host.Core corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray()); } - if (corsBuilder != null) + var originalBuilder = corsBuilder; + corsBuilder = builder => { - var originalBuilder = corsBuilder; - corsBuilder = builder => originalBuilder(builder.AllowAnyHeader().AllowAnyMethod()); - applicationBuilder.UseCors(corsBuilder); - } + builder.AllowAnyHeader().AllowAnyMethod(); + originalBuilder?.Invoke(builder); + }; + applicationBuilder.UseCors(corsBuilder); // Do not service requests until Ready is called, this will return 503 until that point applicationBuilder.UseAsyncInitialization(async cancellationToken => diff --git a/src/Tgstation.Server.Host/Core/SetupWizard.cs b/src/Tgstation.Server.Host/Core/SetupWizard.cs index ed782260ff..b7ef8aa1db 100644 --- a/src/Tgstation.Server.Host/Core/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Core/SetupWizard.cs @@ -274,8 +274,10 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = "CREATE DATABASE ?"; - command.Parameters.Add(databaseName); + // I really don't care about user sanitization here, they want to fuck their own DB? so be it +#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities + command.CommandText = $"CREATE DATABASE {databaseName}"; +#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); } @@ -283,8 +285,9 @@ namespace Tgstation.Server.Host.Core await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false); using (var command = testConnection.CreateCommand()) { - command.CommandText = "DROP DATABASE ?"; - command.Parameters.Add(databaseName); +#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities + command.CommandText = $"DROP DATABASE {databaseName}"; +#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities try { await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs index 8bc131c39b..45cbec1e27 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs @@ -12,7 +12,7 @@ namespace Tgstation.Server.Host.Models.Migrations /// public MySqlDatabaseContext CreateDbContext(string[] args) { - using (var loggerFactory = LoggerFactory.Create(builder => { })) + using (var loggerFactory = new LoggerFactory()) { return new MySqlDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); } diff --git a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs index 4ae89b26f1..413bfbc5aa 100644 --- a/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs +++ b/src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs @@ -12,7 +12,7 @@ namespace Tgstation.Server.Host.Models.Migrations /// public SqlServerDatabaseContext CreateDbContext(string[] args) { - using (var loggerFactory = LoggerFactory.Create(builder => { })) + using (var loggerFactory = new LoggerFactory()) { return new SqlServerDatabaseContext(new DbContextOptions(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher())), loggerFactory.CreateLogger()); } diff --git a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj index f42cd119c1..10e2edcd18 100644 --- a/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj +++ b/src/Tgstation.Server.Host/Tgstation.Server.Host.csproj @@ -56,7 +56,7 @@ - + @@ -64,16 +64,16 @@ all runtime; build; native; contentfiles; analyzers - - - - + + + + all runtime; build; native; contentfiles; analyzers - + @@ -85,7 +85,7 @@ - + diff --git a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj index 96f5271bd2..437b828ee5 100644 --- a/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj +++ b/tests/Tgstation.Server.Api.Tests/Tgstation.Server.Api.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -10,7 +10,7 @@ - + diff --git a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj index 630454e342..aea9a97479 100644 --- a/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj +++ b/tests/Tgstation.Server.Client.Tests/Tgstation.Server.Client.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj index f4b36fb2ca..0164631270 100644 --- a/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj +++ b/tests/Tgstation.Server.Host.Console.Tests/Tgstation.Server.Host.Console.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs index ce4f7fc2c0..4cbfc16d8e 100644 --- a/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs +++ b/tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs @@ -18,11 +18,11 @@ namespace Tgstation.Server.Host.Service.Tests [TestMethod] public void TestConstructionAndDisposal() { - Assert.ThrowsException(() => new ServerService(null, null, null, default)); + Assert.ThrowsException(() => new ServerService(null, null, default)); var mockWatchdogFactory = new Mock(); - Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, null, default)); - LoggerFactory.Create(builder => Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, builder, null, default))); - LoggerFactory.Create(builder => { new ServerService(mockWatchdogFactory.Object, builder, () => null, default).Dispose(); }); + Assert.ThrowsException(() => new ServerService(mockWatchdogFactory.Object, null, default)); + var mockLoggerFactory = new LoggerFactory(); + new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose(); } [TestMethod] @@ -34,32 +34,23 @@ namespace Tgstation.Server.Host.Service.Tests var mockWatchdog = new Mock(); var args = Array.Empty(); - CancellationToken cancellationToken, originalToken; - using(var cts = new CancellationTokenSource()) - { - originalToken = cts.Token; - cancellationToken = originalToken; - } - var cancelled = false; - - mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny())).Callback((bool x, string[] _, CancellationToken token) => token.Register(() => cancelled = true)).Returns(Task.CompletedTask).Verifiable(); + CancellationToken cancellationToken; + mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny())).Callback((bool x, string[] _, CancellationToken token) => cancellationToken = token).Returns(Task.CompletedTask).Verifiable(); var mockWatchdogFactory = new Mock(); + var mockLoggerFactory = new LoggerFactory(); + mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable(); - ServerService service = null; - ILoggerFactory loggerFactory = null; - using (loggerFactory = LoggerFactory.Create(builder => service = new ServerService(mockWatchdogFactory.Object, builder, () => loggerFactory, default))) - using (service) + using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default)) { - mockWatchdogFactory.Setup(x => x.CreateWatchdog(loggerFactory)).Returns(mockWatchdog.Object).Verifiable(); - Assert.IsFalse(cancelled); onStart.Invoke(service, new object[] { args }); - mockWatchdog.VerifyAll(); - Assert.AreNotSame(cancellationToken, originalToken); + Assert.IsFalse(cancellationToken.IsCancellationRequested); onStop.Invoke(service, Array.Empty()); - Assert.IsTrue(cancelled); + Assert.IsTrue(cancellationToken.IsCancellationRequested); + mockWatchdog.VerifyAll(); } + mockWatchdogFactory.VerifyAll(); } } diff --git a/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs index 8dbe49f363..5104fd0696 100644 --- a/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs +++ b/tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs @@ -202,15 +202,25 @@ namespace Tgstation.Server.Host.Core.Tests mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable(); + + // This list is here for ease of debugging. + var consolePlayback = new List(); + mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny())).Returns(Task.CompletedTask).Verifiable(); mockConsole.Setup(x => x.ReadLineAsync(It.IsAny(), It.IsAny())).Returns(() => { if (inputPos == finalInputSequence.Count) Assert.Fail("Exhausted input sequence!"); var res = finalInputSequence[inputPos++]; + consolePlayback.Add($"Input: {res}"); return Task.FromResult(res); }).Verifiable(); - mockConsole.Setup(x => x.WriteAsync(It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.CompletedTask).Verifiable(); + + mockConsole + .Setup(x => x.WriteAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((message, error, token) => consolePlayback.Add($"Output: {message}")) + .Returns(Task.CompletedTask) + .Verifiable(); Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false)); //first real run diff --git a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj index 33b5e80774..dcf77140ac 100644 --- a/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj +++ b/tests/Tgstation.Server.Host.Tests/Tgstation.Server.Host.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj index 9ea94c013c..8eec7201d2 100644 --- a/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj +++ b/tests/Tgstation.Server.Host.Watchdog.Tests/Tgstation.Server.Host.Watchdog.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -15,7 +15,7 @@ - + diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index a77962acd1..d5b1fe13ef 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -117,7 +117,7 @@ namespace Tgstation.Server.Tests } catch (ServiceUnavailableException) { - //migrating, to be expected + // migrating, to be expected if (DateTimeOffset.Now > giveUpAt) throw; await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); diff --git a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj index 1e79b7ab42..2b58b04e27 100644 --- a/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj +++ b/tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -9,7 +9,7 @@ - +