diff --git a/ProjectLighthouse.Servers.Website/Pages/Partials/CaptchaPartial.cshtml b/ProjectLighthouse.Servers.Website/Pages/Partials/CaptchaPartial.cshtml index d54cebce..3a202ba9 100644 --- a/ProjectLighthouse.Servers.Website/Pages/Partials/CaptchaPartial.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/Partials/CaptchaPartial.cshtml @@ -1,6 +1,17 @@ @using LBPUnion.ProjectLighthouse.Configuration @if (ServerConfiguration.Instance.Captcha.CaptchaEnabled) { -
- + @switch (ServerConfiguration.Instance.Captcha.Type) + { + case CaptchaType.HCaptcha: +
+ + break; + case CaptchaType.ReCaptcha: +
+ + break; + default: + throw new ArgumentOutOfRangeException(); + } } \ No newline at end of file diff --git a/ProjectLighthouse/Configuration/CaptchaType.cs b/ProjectLighthouse/Configuration/CaptchaType.cs new file mode 100644 index 00000000..564d99c9 --- /dev/null +++ b/ProjectLighthouse/Configuration/CaptchaType.cs @@ -0,0 +1,16 @@ +namespace LBPUnion.ProjectLighthouse.Configuration; + +/// +/// The service to be used for presenting captchas to the user. +/// +public enum CaptchaType +{ + /// + /// A privacy-first captcha. https://www.hcaptcha.com/ + /// + HCaptcha, + /// + /// A captcha service by Google. https://developers.google.com/recaptcha/ + /// + ReCaptcha, +} \ No newline at end of file diff --git a/ProjectLighthouse/Configuration/ConfigurationCategories/CaptchaConfiguration.cs b/ProjectLighthouse/Configuration/ConfigurationCategories/CaptchaConfiguration.cs index fad16ae6..fd4ea31d 100644 --- a/ProjectLighthouse/Configuration/ConfigurationCategories/CaptchaConfiguration.cs +++ b/ProjectLighthouse/Configuration/ConfigurationCategories/CaptchaConfiguration.cs @@ -2,11 +2,10 @@ namespace LBPUnion.ProjectLighthouse.Configuration.ConfigurationCategories; public class CaptchaConfiguration { - // TODO: support recaptcha, not just hcaptcha - // use an enum to define which captcha services can be used? - // LBPUnion.ProjectLighthouse.Types.Settings.CaptchaService public bool CaptchaEnabled { get; set; } + public CaptchaType Type { get; set; } = CaptchaType.HCaptcha; + public string SiteKey { get; set; } = ""; public string Secret { get; set; } = ""; diff --git a/ProjectLighthouse/Configuration/ServerConfiguration.cs b/ProjectLighthouse/Configuration/ServerConfiguration.cs index 3142339e..30c5ee41 100644 --- a/ProjectLighthouse/Configuration/ServerConfiguration.cs +++ b/ProjectLighthouse/Configuration/ServerConfiguration.cs @@ -23,7 +23,7 @@ public class ServerConfiguration // You can use an ObsoleteAttribute instead. Make sure you set it to error, though. // // Thanks for listening~ - public const int CurrentConfigVersion = 6; + public const int CurrentConfigVersion = 7; #region Meta diff --git a/ProjectLighthouse/Extensions/RequestExtensions.cs b/ProjectLighthouse/Extensions/RequestExtensions.cs index d375246c..c922945d 100644 --- a/ProjectLighthouse/Extensions/RequestExtensions.cs +++ b/ProjectLighthouse/Extensions/RequestExtensions.cs @@ -15,7 +15,21 @@ namespace LBPUnion.ProjectLighthouse.Extensions; public static class RequestExtensions { - + static RequestExtensions() + { + Uri captchaUri = ServerConfiguration.Instance.Captcha.Type switch + { + CaptchaType.HCaptcha => new Uri("https://hcaptcha.com"), + CaptchaType.ReCaptcha => new Uri("https://www.google.com/recaptcha/api/"), + _ => throw new ArgumentOutOfRangeException(), + }; + + client = new HttpClient + { + BaseAddress = captchaUri, + }; + } + #region Mobile Checking // yoinked and adapted from https://stackoverflow.com/a/68641796 @@ -32,10 +46,7 @@ public static class RequestExtensions #region Captcha - private static readonly HttpClient client = new() - { - BaseAddress = new Uri("https://hcaptcha.com"), - }; + private static readonly HttpClient client; [SuppressMessage("ReSharper", "ArrangeObjectCreationWhenTypeNotEvident")] private static async Task verifyCaptcha(string token) @@ -48,7 +59,7 @@ public static class RequestExtensions new("response", token), }; - HttpResponseMessage response = await client.PostAsync("/siteverify", new FormUrlEncodedContent(payload)); + HttpResponseMessage response = await client.PostAsync("siteverify", new FormUrlEncodedContent(payload)); response.EnsureSuccessStatusCode(); @@ -63,7 +74,14 @@ public static class RequestExtensions { if (ServerConfiguration.Instance.Captcha.CaptchaEnabled) { - bool gotCaptcha = request.Form.TryGetValue("h-captcha-response", out StringValues values); + string keyName = ServerConfiguration.Instance.Captcha.Type switch + { + CaptchaType.HCaptcha => "h-captcha-response", + CaptchaType.ReCaptcha => "g-recaptcha-response", + _ => throw new ArgumentOutOfRangeException(), + }; + + bool gotCaptcha = request.Form.TryGetValue(keyName, out StringValues values); if (!gotCaptcha) return false; if (!await verifyCaptcha(values[0])) return false;