diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 42203e2250..a2ac5f8698 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,6 @@ -[Release Notes]: # (Your PR should contain a detailed list of notable changes, titled appropriately. This includes any observable changes to the server or DMAPI. See examples below) +[Base Branch]: # (Please set the base branch of your pull request appropriately. If you only made a patch, code improvement, non-server code change, or comment/documentation update please target the `master` branch. Otherwise, target the `dev` branch.) + +[Release Notes]: # (Your PR should contain a detailed list of notable changes, titled appropriately. This includes any observable changes to the server or DMAPI. See examples below.) :cl: Description of your change. diff --git a/build/Version.props b/build/Version.props index d26a034fa2..4a6fc31913 100644 --- a/build/Version.props +++ b/build/Version.props @@ -2,11 +2,11 @@ - 4.5.1 + 4.5.2 2.1.0 - 7.3.1 - 8.3.1 - 5.2.5 + 7.3.2 + 8.3.2 + 5.2.6 0.4.0 1.1.0 diff --git a/src/DMAPI/tgs.dm b/src/DMAPI/tgs.dm index 69afea8ea2..aef492020a 100644 --- a/src/DMAPI/tgs.dm +++ b/src/DMAPI/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "5.2.5" +#define TGS_DMAPI_VERSION "5.2.6" // All functions and datums outside this document are subject to change with any version and should not be relied on. diff --git a/src/DMAPI/tgs/v3210/api.dm b/src/DMAPI/tgs/v3210/api.dm index 9ed512f8f9..1b9d194e40 100644 --- a/src/DMAPI/tgs/v3210/api.dm +++ b/src/DMAPI/tgs/v3210/api.dm @@ -39,7 +39,7 @@ var/warned_custom_commands = FALSE /datum/tgs_api/v3210/ApiVersion() - return new /datum/tgs_version("3.2.1.1") + return new /datum/tgs_version("3.2.1.2") /datum/tgs_api/v3210/proc/trim_left(text) for (var/i = 1 to length(text)) diff --git a/src/DMAPI/tgs/v3210/commands.dm b/src/DMAPI/tgs/v3210/commands.dm index a8c3d318e5..8975179cb0 100644 --- a/src/DMAPI/tgs/v3210/commands.dm +++ b/src/DMAPI/tgs/v3210/commands.dm @@ -44,7 +44,7 @@ user.friendly_name = sender // Discord hack, fix the mention if it's only numbers (fuck you IRC trolls) - var/regex/discord_id_regex = regex(@"[0-9]+") + var/regex/discord_id_regex = regex(@"^[0-9]+$") if(discord_id_regex.Find(sender)) sender = "<@[sender]>" diff --git a/src/DMAPI/tgs/v5/api.dm b/src/DMAPI/tgs/v5/api.dm index d4326fc4a2..7c853cd7c1 100644 --- a/src/DMAPI/tgs/v5/api.dm +++ b/src/DMAPI/tgs/v5/api.dm @@ -18,7 +18,7 @@ var/initialized = FALSE /datum/tgs_api/v5/ApiVersion() - return new /datum/tgs_version("5.2.5") + return new /datum/tgs_version("5.2.6") /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) server_port = world.params[DMAPI5_PARAM_SERVER_PORT] diff --git a/src/Tgstation.Server.Api/Rights/RightsHelper.cs b/src/Tgstation.Server.Api/Rights/RightsHelper.cs index 27e550d41f..eeda047b88 100644 --- a/src/Tgstation.Server.Api/Rights/RightsHelper.cs +++ b/src/Tgstation.Server.Api/Rights/RightsHelper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; @@ -40,7 +40,6 @@ namespace Tgstation.Server.Api.Rights /// A representing the claim role name public static string RoleNames(TRight right) where TRight : Enum { - var flags = new List(); IEnumerable GetRoleNames() { foreach (Enum J in Enum.GetValues(right.GetType())) diff --git a/src/Tgstation.Server.Host/Components/Interop/DMApiConstants.cs b/src/Tgstation.Server.Host/Components/Interop/DMApiConstants.cs index 321735a5b6..fc802ebccf 100644 --- a/src/Tgstation.Server.Host/Components/Interop/DMApiConstants.cs +++ b/src/Tgstation.Server.Host/Components/Interop/DMApiConstants.cs @@ -33,7 +33,7 @@ namespace Tgstation.Server.Host.Components.Interop /// /// The DMAPI being used. /// - public static readonly Version Version = new Version(5, 2, 5); + public static readonly Version Version = new Version(5, 2, 6); /// /// for use when communicating with the DMAPI. diff --git a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs index de5bfb0174..5805339a58 100644 --- a/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs +++ b/src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs @@ -480,7 +480,17 @@ namespace Tgstation.Server.Host.Components.StaticFiles using (var script = processExecutor.LaunchProcess( ioManager.ConcatPath(resolvedScriptsDir, I), resolvedScriptsDir, - String.Join(' ', parameters), + String.Join( + ' ', + parameters.Select(arg => + { + if (!arg.Contains(' ', StringComparison.Ordinal)) + return arg; + + arg = arg.Replace("\"", "\\\"", StringComparison.Ordinal); + + return $"\"{arg}\""; + })), true, true, true)) diff --git a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs index bb68d12467..c35de94da2 100644 --- a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs +++ b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs @@ -103,7 +103,7 @@ namespace Tgstation.Server.Host.Controllers databaseContext, authenticationContextFactory, logger, - false) + true) { this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory)); this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater)); diff --git a/src/Tgstation.Server.Host/Controllers/ApiController.cs b/src/Tgstation.Server.Host/Controllers/ApiController.cs index 6c66ec832e..90a5c5f448 100644 --- a/src/Tgstation.Server.Host/Controllers/ApiController.cs +++ b/src/Tgstation.Server.Host/Controllers/ApiController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; @@ -48,11 +48,6 @@ namespace Tgstation.Server.Host.Controllers /// protected Models.Instance Instance { get; } - /// - /// If permissions are required to access the - /// - readonly bool requireInstance; - /// /// If are required /// @@ -64,14 +59,12 @@ namespace Tgstation.Server.Host.Controllers /// The value of /// The for the /// The value of - /// The value of /// The value of public ApiController( IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, - bool requireInstance, - bool requireHeaders = true) + bool requireHeaders) { DatabaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext)); if (authenticationContextFactory == null) @@ -79,7 +72,6 @@ namespace Tgstation.Server.Host.Controllers Logger = logger ?? throw new ArgumentNullException(nameof(logger)); AuthenticationContext = authenticationContextFactory.CurrentAuthenticationContext; Instance = AuthenticationContext?.InstanceUser?.Instance; - this.requireInstance = requireInstance; this.requireHeaders = requireHeaders; } @@ -124,11 +116,11 @@ namespace Tgstation.Server.Host.Controllers protected ObjectResult Created(object payload) => StatusCode((int)HttpStatusCode.Created, payload); /// - /// Performs validation steps for an instance request. + /// Performs validation a request. /// /// The for the operation. /// A resulting in an appropriate on validation failure, otherwise. - protected virtual Task ValidateInstanceRequest(CancellationToken cancellationToken) + protected virtual Task ValidateRequest(CancellationToken cancellationToken) => Task.FromResult(null); /// @@ -193,20 +185,11 @@ namespace Tgstation.Server.Host.Controllers return; } - if (requireInstance) + var errorCase = await ValidateRequest(context.HttpContext.RequestAborted).ConfigureAwait(false); + if (errorCase != null) { - IActionResult errorCase = null; - if (!ApiHeaders.InstanceId.HasValue) - errorCase = BadRequest(new ErrorMessage(ErrorCode.InstanceHeaderRequired)); - else if (AuthenticationContext.InstanceUser == null) - errorCase = Forbid(); - - errorCase ??= await ValidateInstanceRequest(context.HttpContext.RequestAborted).ConfigureAwait(false); - if (errorCase != null) - { - await errorCase.ExecuteResultAsync(context).ConfigureAwait(false); - return; - } + await errorCase.ExecuteResultAsync(context).ConfigureAwait(false); + return; } } catch (HeadersException) diff --git a/src/Tgstation.Server.Host/Controllers/HomeController.cs b/src/Tgstation.Server.Host/Controllers/HomeController.cs index f8c5195413..58b20a3fe4 100644 --- a/src/Tgstation.Server.Host/Controllers/HomeController.cs +++ b/src/Tgstation.Server.Host/Controllers/HomeController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -99,7 +99,6 @@ namespace Tgstation.Server.Host.Controllers databaseContext, authenticationContextFactory, logger, - false, (browserResolver ?? throw new ArgumentNullException(nameof(browserResolver))).Browser.Type != BrowserType.Generic && (controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions))).Enable) { diff --git a/src/Tgstation.Server.Host/Controllers/InstanceController.cs b/src/Tgstation.Server.Host/Controllers/InstanceController.cs index aacf3a0fe6..126458dba5 100644 --- a/src/Tgstation.Server.Host/Controllers/InstanceController.cs +++ b/src/Tgstation.Server.Host/Controllers/InstanceController.cs @@ -90,7 +90,7 @@ namespace Tgstation.Server.Host.Controllers databaseContext, authenticationContextFactory, logger, - false) + true) { this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager)); this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager)); diff --git a/src/Tgstation.Server.Host/Controllers/InstanceRequiredController.cs b/src/Tgstation.Server.Host/Controllers/InstanceRequiredController.cs index a2474c0c34..2ec482ef59 100644 --- a/src/Tgstation.Server.Host/Controllers/InstanceRequiredController.cs +++ b/src/Tgstation.Server.Host/Controllers/InstanceRequiredController.cs @@ -37,15 +37,19 @@ namespace Tgstation.Server.Host.Controllers databaseContext, authenticationContextFactory, logger, - true, true) { this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager)); } /// - protected override async Task ValidateInstanceRequest(CancellationToken cancellationToken) + protected override async Task ValidateRequest(CancellationToken cancellationToken) { + if (!ApiHeaders.InstanceId.HasValue) + return BadRequest(new ErrorMessage(ErrorCode.InstanceHeaderRequired)); + if (AuthenticationContext.InstanceUser == null) + return Forbid(); + if (ValidateInstanceOnlineStatus(instanceManager, Logger, Instance)) await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Controllers/UserController.cs b/src/Tgstation.Server.Host/Controllers/UserController.cs index 5144039371..485216faa4 100644 --- a/src/Tgstation.Server.Host/Controllers/UserController.cs +++ b/src/Tgstation.Server.Host/Controllers/UserController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -58,7 +58,7 @@ namespace Tgstation.Server.Host.Controllers databaseContext, authenticationContextFactory, logger, - false) + true) { this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory)); this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite)); diff --git a/src/Tgstation.Server.Host/Core/SwaggerConfiguration.cs b/src/Tgstation.Server.Host/Core/SwaggerConfiguration.cs index c231e3c065..b928dd6f2a 100644 --- a/src/Tgstation.Server.Host/Core/SwaggerConfiguration.cs +++ b/src/Tgstation.Server.Host/Core/SwaggerConfiguration.cs @@ -11,7 +11,6 @@ using System.Net; using System.Net.Mime; using Tgstation.Server.Api; using Tgstation.Server.Api.Models; -using Tgstation.Server.Api.Rights; using Tgstation.Server.Host.Controllers; namespace Tgstation.Server.Host.Core @@ -228,7 +227,7 @@ namespace Tgstation.Server.Host.Core } }; - if (authAttributes.Any(attr => attr.RightsType.HasValue && RightsHelper.IsInstanceRight(attr.RightsType.Value))) + if (typeof(InstanceRequiredController).IsAssignableFrom(context.MethodInfo.DeclaringType)) operation.Parameters.Add(new OpenApiParameter { Reference = new OpenApiReference