From 671083cc973225767244501efde6ff4bbe54bd45 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Thu, 28 Jul 2022 16:27:55 +0100 Subject: [PATCH 1/3] Invision Community OAuth Support --- .../Models/OAuthProvider.cs | 5 ++ .../OAuth/InvisionCommunityOAuthValidator.cs | 55 +++++++++++++++++++ .../Security/OAuth/OAuthProviders.cs | 8 +++ 3 files changed, 68 insertions(+) create mode 100644 src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs diff --git a/src/Tgstation.Server.Api/Models/OAuthProvider.cs b/src/Tgstation.Server.Api/Models/OAuthProvider.cs index 716686ed16..a6dfbe07bb 100644 --- a/src/Tgstation.Server.Api/Models/OAuthProvider.cs +++ b/src/Tgstation.Server.Api/Models/OAuthProvider.cs @@ -28,5 +28,10 @@ namespace Tgstation.Server.Api.Models /// https://www.keycloak.org /// Keycloak, + + /// + /// https://invisioncommunity.com/ + /// + InvisionCommunity, } } diff --git a/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs new file mode 100644 index 0000000000..ec437e0a89 --- /dev/null +++ b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs @@ -0,0 +1,55 @@ +using System; +using System.Net.Http; + +using Microsoft.Extensions.Logging; + +using Tgstation.Server.Api.Models; +using Tgstation.Server.Host.Configuration; +using Tgstation.Server.Host.System; + +namespace Tgstation.Server.Host.Security.OAuth +{ + /// + /// OAuth validator for Discord. + /// + sealed class InvisionCommunityOAuthValidator : GenericOAuthValidator + { + /// + public override OAuthProvider Provider => OAuthProvider.InvisionCommunity; + + /// + protected override Uri TokenUrl => new Uri($"{BaseProtocolPath}/oauth/token/"); + + /// + protected override Uri UserInformationUrl => new Uri($"{BaseProtocolPath}/api/core/me"); + + /// + /// Base path to the server's OAuth endpoint. + /// + string BaseProtocolPath => $"{OAuthConfiguration.ServerUrl}"; + + /// + /// Initializes a new instance of the class. + /// + /// The for the . + /// The for the . + /// The for the . + /// The for the . + public InvisionCommunityOAuthValidator( + IHttpClientFactory httpClientFactory, + IAssemblyInformationProvider assemblyInformationProvider, + ILogger logger, + OAuthConfiguration oAuthConfiguration) + : base(httpClientFactory, assemblyInformationProvider, logger, oAuthConfiguration) { + } + + /// + protected override OAuthTokenRequest CreateTokenRequest(string code) => new OAuthTokenRequest(OAuthConfiguration, code, "profile"); + + /// + protected override string DecodeTokenPayload(dynamic responseJson) => responseJson.access_token; + + /// + protected override string DecodeUserInformationPayload(dynamic responseJson) => responseJson.id; + } +} diff --git a/src/Tgstation.Server.Host/Security/OAuth/OAuthProviders.cs b/src/Tgstation.Server.Host/Security/OAuth/OAuthProviders.cs index b51f21a61c..5337ee051f 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/OAuthProviders.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/OAuthProviders.cs @@ -79,6 +79,14 @@ namespace Tgstation.Server.Host.Security.OAuth assemblyInformationProvider, loggerFactory.CreateLogger(), keyCloakConfig)); + + if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.InvisionCommunity, out var invisionConfig)) + validatorsBuilder.Add( + new InvisionCommunityOAuthValidator( + httpClientFactory, + assemblyInformationProvider, + loggerFactory.CreateLogger(), + invisionConfig)); } /// From 00eab2d91731b97e1f457d7b80badfc682a1fa48 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Thu, 28 Jul 2022 16:34:22 +0100 Subject: [PATCH 2/3] Style stuff --- .../Security/OAuth/InvisionCommunityOAuthValidator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs index ec437e0a89..cd37c98b01 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs @@ -40,7 +40,8 @@ namespace Tgstation.Server.Host.Security.OAuth IAssemblyInformationProvider assemblyInformationProvider, ILogger logger, OAuthConfiguration oAuthConfiguration) - : base(httpClientFactory, assemblyInformationProvider, logger, oAuthConfiguration) { + : base(httpClientFactory, assemblyInformationProvider, logger, oAuthConfiguration) + { } /// From d1a38126641ad2db43671e33744a3d6d833c07f2 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Thu, 28 Jul 2022 17:36:22 +0100 Subject: [PATCH 3/3] Cyber tweaks --- build/Version.props | 4 ++-- .../Security/OAuth/InvisionCommunityOAuthValidator.cs | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/build/Version.props b/build/Version.props index 6592d09c26..39031953f1 100644 --- a/build/Version.props +++ b/build/Version.props @@ -4,8 +4,8 @@ 4.17.0 - 4.1.0 - 9.4.0 + 4.2.0 + 9.5.0 9.4.0 10.5.0 6.0.5 diff --git a/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs index cd37c98b01..e0021d0143 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/InvisionCommunityOAuthValidator.cs @@ -10,7 +10,7 @@ using Tgstation.Server.Host.System; namespace Tgstation.Server.Host.Security.OAuth { /// - /// OAuth validator for Discord. + /// OAuth validator for Invision Community (selfhosted). /// sealed class InvisionCommunityOAuthValidator : GenericOAuthValidator { @@ -18,15 +18,10 @@ namespace Tgstation.Server.Host.Security.OAuth public override OAuthProvider Provider => OAuthProvider.InvisionCommunity; /// - protected override Uri TokenUrl => new Uri($"{BaseProtocolPath}/oauth/token/"); + protected override Uri TokenUrl => new Uri($"{OAuthConfiguration.ServerUrl}/oauth/token/"); // This needs the trailing slash or it doesnt get the token. Do not remove. /// - protected override Uri UserInformationUrl => new Uri($"{BaseProtocolPath}/api/core/me"); - - /// - /// Base path to the server's OAuth endpoint. - /// - string BaseProtocolPath => $"{OAuthConfiguration.ServerUrl}"; + protected override Uri UserInformationUrl => new Uri($"{OAuthConfiguration.ServerUrl}/api/core/me"); /// /// Initializes a new instance of the class.