Skip to content

Commit

Permalink
Merge pull request #11 from jgdevlabs/dev
Browse files Browse the repository at this point in the history
Make the ValidateRecaptchaFilter accessible
  • Loading branch information
jooni91 committed Apr 27, 2022
2 parents 5b9d40d + ef06a16 commit b8ab3c8
Show file tree
Hide file tree
Showing 12 changed files with 64 additions and 24 deletions.
34 changes: 26 additions & 8 deletions docs/Griesoft.AspNetCore.ReCaptcha.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/ReCaptcha/Enums/ValidationError.cs
Expand Up @@ -6,7 +6,7 @@
public enum ValidationError
{
/// <summary>
/// Somethign went wrong in a very bad way. You can consider yourself lucky when you hit this error.
/// Something went wrong in a very bad way. You can consider yourself lucky when you hit this error.
/// </summary>
Undefined,

Expand All @@ -16,7 +16,7 @@ public enum ValidationError
MissingInputSecret,

/// <summary>
/// The secret parameter is invalid or malformed. Make sure you have not switched the secret key with the site key accidently.
/// The secret parameter is invalid or malformed. Make sure you have not switched the secret key with the site key accidentally.
/// </summary>
InvalidInputSecret,

Expand Down
2 changes: 1 addition & 1 deletion src/ReCaptcha/Extensions/RecaptchaServiceExtensions.cs
Expand Up @@ -31,7 +31,7 @@ public static IServiceCollection AddRecaptchaService(this IServiceCollection ser
client.BaseAddress = new Uri(RecaptchaServiceConstants.GoogleRecaptchaEndpoint);
});

services.AddTransient<ValidateRecaptchaFilter>();
services.AddTransient<IValidateRecaptchaFilter, ValidateRecaptchaFilter>();

return services;
}
Expand Down
2 changes: 1 addition & 1 deletion src/ReCaptcha/Filters/IRecaptchaValidationFailedResult.cs
Expand Up @@ -3,7 +3,7 @@
namespace Griesoft.AspNetCore.ReCaptcha.Filters
{
/// <summary>
/// Represents an <see cref="IActionResult"/> that is used when the recaptcha validation failed.
/// Represents an <see cref="IActionResult"/> that is used when the reCAPTCHA validation failed.
/// This can be matched inside MVC result filters to process the validation failure.
/// </summary>
public interface IRecaptchaValidationFailedResult : IActionResult
Expand Down
23 changes: 23 additions & 0 deletions src/ReCaptcha/Filters/IValidateRecaptchaFilter.cs
@@ -0,0 +1,23 @@
using Microsoft.AspNetCore.Mvc.Filters;

namespace Griesoft.AspNetCore.ReCaptcha.Filters
{
/// <summary>
/// An action filter which does validate that the request contains a valid reCAPTCHA token.
/// </summary>
public interface IValidateRecaptchaFilter : IAsyncActionFilter
{
/// <summary>
/// The action that the filter should take when validation of a token fails.
/// </summary>
public ValidationFailedAction OnValidationFailedAction { get; set; }

/// <summary>
/// The reCAPTCHA V3 action name.
/// </summary>
/// <remarks>
/// This will also be validated for a matching action name in the validation response from the reCAPTCHA service.
/// </remarks>
public string? Action { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/ReCaptcha/Filters/RecaptchaValidationFailedResult.cs
Expand Up @@ -5,7 +5,7 @@
namespace Griesoft.AspNetCore.ReCaptcha.Filters
{
/// <summary>
/// A bad request result used for recaptcha validation failures. Use <see cref="IRecaptchaValidationFailedResult"/> to
/// A bad request result used for reCAPTCHA validation failures. Use <see cref="IRecaptchaValidationFailedResult"/> to
/// match for validation failures inside MVC result filters.
/// </summary>
public class RecaptchaValidationFailedResult : IActionResult, IRecaptchaValidationFailedResult
Expand Down
3 changes: 1 addition & 2 deletions src/ReCaptcha/Filters/ValidateRecaptchaFilter.cs
Expand Up @@ -5,7 +5,6 @@
using System.Threading.Tasks;
using Griesoft.AspNetCore.ReCaptcha.Configuration;
using Griesoft.AspNetCore.ReCaptcha.Extensions;
using Griesoft.AspNetCore.ReCaptcha.Localization;
using Griesoft.AspNetCore.ReCaptcha.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
Expand All @@ -15,7 +14,7 @@
[assembly: InternalsVisibleTo("ReCaptcha.Tests")]
namespace Griesoft.AspNetCore.ReCaptcha.Filters
{
internal class ValidateRecaptchaFilter : IAsyncActionFilter
internal class ValidateRecaptchaFilter : IValidateRecaptchaFilter
{
private readonly IRecaptchaService _recaptchaService;
private readonly RecaptchaOptions _options;
Expand Down
4 changes: 2 additions & 2 deletions src/ReCaptcha/Models/ValidationResponse.cs
Expand Up @@ -30,13 +30,13 @@ public class ValidationResponse
public string? Action { get; set; } = null;

/// <summary>
/// Timestamp of the challenge load.
/// Time stamp of the challenge load.
/// </summary>
[JsonProperty(PropertyName = "challenge_ts")]
public DateTime ChallengeTimeStamp { get; set; }

/// <summary>
/// The hostname of the site where the reCAPTCHA was solved.
/// The host name of the site where the reCAPTCHA was solved.
/// </summary>
[JsonProperty(PropertyName = "hostname")]
public string Hostname { get; set; } = string.Empty;
Expand Down
2 changes: 1 addition & 1 deletion src/ReCaptcha/Services/IRecaptchaService.cs
Expand Up @@ -4,7 +4,7 @@
namespace Griesoft.AspNetCore.ReCaptcha.Services
{
/// <summary>
/// A service for reCAPTCHA response backend validation.
/// A service for reCAPTCHA response back-end validation.
/// </summary>
public interface IRecaptchaService
{
Expand Down
4 changes: 2 additions & 2 deletions src/ReCaptcha/ValidateRecaptchaAttribute.cs
Expand Up @@ -40,11 +40,11 @@ public sealed class ValidateRecaptchaAttribute : Attribute, IFilterFactory, IOrd
/// </summary>
/// <param name="serviceProvider">The request <see cref="IServiceProvider"/>.</param>
/// <returns>An instance of the executable filter.</returns>
/// <exception cref="InvalidOperationException">Thrown if the required services ar not registered.</exception>
/// <exception cref="InvalidOperationException">Thrown if the required services are not registered.</exception>
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
#pragma warning disable CA1062 // Validate arguments of public methods
var filter = serviceProvider.GetService(typeof(ValidateRecaptchaFilter)) as ValidateRecaptchaFilter;
var filter = serviceProvider.GetService(typeof(IValidateRecaptchaFilter)) as IValidateRecaptchaFilter;
#pragma warning restore CA1062 // Validate arguments of public methods

_ = filter ?? throw new InvalidOperationException(Resources.RequiredServiceNotRegisteredErrorMessage);
Expand Down
Expand Up @@ -18,7 +18,7 @@ public void AddRecaptchaService_ShouldAddAllRequired_WithDefaultOptions()

// Assert
Assert.IsTrue(services.Any(service => service.ServiceType.FullName == "Griesoft.AspNetCore.ReCaptcha.Services.IRecaptchaService"));
Assert.IsTrue(services.Any(service => service.ServiceType.FullName == "Griesoft.AspNetCore.ReCaptcha.Filters.ValidateRecaptchaFilter"));
Assert.IsTrue(services.Any(service => service.ServiceType.FullName == "Griesoft.AspNetCore.ReCaptcha.Filters.IValidateRecaptchaFilter"));
Assert.IsTrue(services.Any(service => service.ServiceType.FullName == "Microsoft.Extensions.Options.IConfigureOptions`1[[Griesoft.AspNetCore.ReCaptcha.Configuration.RecaptchaOptions, Griesoft.AspNetCore.ReCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"));
Assert.IsTrue(services.Any(service => service.ServiceType.FullName == "Microsoft.Extensions.Options.IConfigureOptions`1[[Griesoft.AspNetCore.ReCaptcha.Configuration.RecaptchaSettings, Griesoft.AspNetCore.ReCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"));
}
Expand Down
6 changes: 3 additions & 3 deletions tests/ReCaptcha.Tests/ValidateRecaptchaAttributeTests.cs
Expand Up @@ -36,7 +36,7 @@ public void CreateInstance_ShouldReturn_ValidateRecaptchaFilter_WithDefaultOnVal
optionsMock.SetupGet(options => options.CurrentValue)
.Returns(new RecaptchaOptions());
var servicesMock = new Mock<IServiceProvider>();
servicesMock.Setup(provider => provider.GetService(typeof(ValidateRecaptchaFilter)))
servicesMock.Setup(provider => provider.GetService(typeof(IValidateRecaptchaFilter)))
.Returns(new ValidateRecaptchaFilter(null, optionsMock.Object, null))
.Verifiable();
var attribute = new ValidateRecaptchaAttribute();
Expand All @@ -60,7 +60,7 @@ public void CreateInstance_ShouldReturn_ValidateRecaptchaFilter_WithUserSetOnVal
optionsMock.SetupGet(options => options.CurrentValue)
.Returns(new RecaptchaOptions());
var servicesMock = new Mock<IServiceProvider>();
servicesMock.Setup(provider => provider.GetService(typeof(ValidateRecaptchaFilter)))
servicesMock.Setup(provider => provider.GetService(typeof(IValidateRecaptchaFilter)))
.Returns(new ValidateRecaptchaFilter(null, optionsMock.Object, null))
.Verifiable();
var attribute = new ValidateRecaptchaAttribute
Expand All @@ -87,7 +87,7 @@ public void CreateInstance_ShouldReturn_ValidateRecaptchaFilter_WithUserSetActio
optionsMock.SetupGet(options => options.CurrentValue)
.Returns(new RecaptchaOptions());
var servicesMock = new Mock<IServiceProvider>();
servicesMock.Setup(provider => provider.GetService(typeof(ValidateRecaptchaFilter)))
servicesMock.Setup(provider => provider.GetService(typeof(IValidateRecaptchaFilter)))
.Returns(new ValidateRecaptchaFilter(null, optionsMock.Object, null))
.Verifiable();
var attribute = new ValidateRecaptchaAttribute
Expand Down

0 comments on commit b8ab3c8

Please sign in to comment.