public void Initialize(string name, string id, string config, params KeyValuePair <Type, object>[] dependencies) { _httpConfig = new HttpConfiguration(); _logger = new Mock <ILogger>().Object; _settings = new SettingsDictionary(); _settings[SecretPrefix + name] = GetConfigValue(id, config); _config = new WebHookReceiverConfig(_settings, _logger); List <KeyValuePair <Type, object> > deps = new List <KeyValuePair <Type, object> >() { new KeyValuePair <Type, object>(typeof(IWebHookReceiverConfig), _config), new KeyValuePair <Type, object>(typeof(SettingsDictionary), _settings) }; deps.AddRange(dependencies); _httpConfig = HttpConfigurationMock.Create(deps); _request = new HttpRequestMessage(); _receiverMock = new WebHookReceiverMock(); _context = new HttpRequestContext { Configuration = _httpConfig }; _request.SetRequestContext(_context); }
protected virtual async Task <string> GetReceiverConfig(HttpRequestMessage request, string name, string id, int minLength, int maxLength) { if (request == null) { throw new ArgumentNullException("request"); } if (name == null) { throw new ArgumentNullException("name"); } // Look up configuration for this receiver and instance HttpConfiguration httpConfig = request.GetConfiguration(); IWebHookReceiverConfig receiverConfig = httpConfig.DependencyResolver.GetReceiverConfig(); string secret = await receiverConfig.GetReceiverConfigAsync(name, id, minLength, maxLength); if (secret == null) { string msg = string.Format(CultureInfo.CurrentCulture, ReceiverResources.Receiver_BadSecret, name, id, minLength, maxLength); httpConfig.DependencyResolver.GetLogger().Error(msg); HttpResponseMessage noSecret = request.CreateErrorResponse(HttpStatusCode.InternalServerError, msg); throw new HttpResponseException(noSecret); } return(secret); }
/// <summary> /// Gets the receiver configuration with the given <paramref name="configurationName"/> and /// <paramref name="id"/>. /// </summary> /// <param name="config">The current <see cref="IWebHookReceiverConfig"/>.</param> /// <param name="configurationName"> /// The name of the configuration to obtain. Typically this is the name of the receiver, e.g. <c>github</c>. /// </param> /// <param name="id"> /// A (potentially empty) ID of a particular configuration for this <see cref="IWebHookReceiver"/>. This /// allows an <see cref="IWebHookReceiver"/> to support multiple WebHook endpoints with individual /// configurations. /// </param> /// <param name="minLength">The minimum length of the key value.</param> /// <param name="maxLength">The maximum length of the key value.</param> public static async Task <string> GetReceiverConfigAsync( this IWebHookReceiverConfig config, string configurationName, string id, int minLength, int maxLength) { if (config == null) { throw new ArgumentNullException(nameof(config)); } if (configurationName == null) { throw new ArgumentNullException(nameof(configurationName)); } // Look up configuration for this name and id. var secret = await config.GetReceiverConfigAsync(configurationName, id); // Verify that configuration value matches length requirements if (secret == null || secret.Length < minLength || secret.Length > maxLength) { return(null); } return(secret); }
/// <summary> /// Resets all values for testing purposes. /// </summary> internal static void Reset() { _receiverManager = null; _receiverConfig = null; _handlerSorter = null; _receivers = null; _handlers = null; }
/// <summary> /// Instantiates a new <see cref="StripeVerifyNotificationIdFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param> /// <param name="optionsAccessor"> /// The <see cref="IOptions{MvcOptions}"/> accessor for <see cref="MvcOptions"/>. /// </param> /// <param name="readerFactory">The <see cref="IHttpRequestStreamReaderFactory"/>.</param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> public StripeVerifyNotificationIdFilter( ILoggerFactory loggerFactory, IModelMetadataProvider metadataProvider, IOptions <MvcOptions> optionsAccessor, IHttpRequestStreamReaderFactory readerFactory, IWebHookReceiverConfig receiverConfig) : this(loggerFactory, metadataProvider, optionsAccessor, readerFactory, receiverConfig, httpClient : null) { }
/// <summary> /// Instantiates a new <see cref="SlackVerifyTokenFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> public SlackVerifyTokenFilter( ILoggerFactory loggerFactory, IModelMetadataProvider metadataProvider, IWebHookReceiverConfig receiverConfig) : base(loggerFactory, receiverConfig) { _formCollectionMetadata = metadataProvider.GetMetadataForType(typeof(IFormCollection)); _formModelBinder = new FormCollectionModelBinder(); }
/// <summary> /// Returns <see langword="true"/> if the configuration value with given <paramref name="key"/> is set to /// 'true'; otherwise <see langword="false"/>. /// </summary> /// <param name="config">The current <see cref="IWebHookReceiverConfig"/>.</param> /// <param name="key">The key to evaluate the value for.</param> /// <returns><see langword="true"/> if the value is set to 'true'; otherwise <see langword="false"/>.</returns> public static bool IsTrue(this IWebHookReceiverConfig config, string key) { var value = config.Configuration[key]; if (string.IsNullOrEmpty(value)) { return(false); } return(bool.TryParse(value.Trim(), out var isSet) ? isSet : false); }
/// <summary> /// Gets an <see cref="IWebHookReceiverConfig"/> implementation registered with the Dependency Injection engine /// or a default implementation if none is registered. /// </summary> /// <param name="services">The <see cref="IDependencyScope"/> implementation.</param> /// <returns>The registered <see cref="IWebHookReceiverManager"/> instance or a default implementation if none are registered.</returns> public static IWebHookReceiverConfig GetReceiverConfig(this IDependencyScope services) { IWebHookReceiverConfig receiverConfig = services.GetService <IWebHookReceiverConfig>(); if (receiverConfig == null) { SettingsDictionary settings = services.GetSettings(); ILogger logger = services.GetLogger(); receiverConfig = ReceiverServices.GetReceiverConfig(settings, logger); } return(receiverConfig); }
public void GetReceiverConfig_ReturnsSingleInstance() { // Arrange SettingsDictionary settings = CommonServices.GetSettings(); ILogger logger = CommonServices.GetLogger(); // Act IWebHookReceiverConfig actual1 = ReceiverServices.GetReceiverConfig(settings, logger); IWebHookReceiverConfig actual2 = ReceiverServices.GetReceiverConfig(settings, logger); // Assert Assert.Same(actual1, actual2); }
/// <summary> /// Instantiates a new <see cref="WebHookVerifyCodeFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// <param name="metadata">The collection of <see cref="IWebHookMetadata"/> services.</param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> public WebHookVerifyCodeFilter( ILoggerFactory loggerFactory, IEnumerable <IWebHookMetadata> metadata, IWebHookReceiverConfig receiverConfig) : base(loggerFactory, receiverConfig) { // No need to keep track of IWebHookSecurityMetadata instances that do not request code verification. var codeVerifierMetadata = metadata .OfType <IWebHookSecurityMetadata>() .Where(item => item.VerifyCodeParameter); _codeVerifierMetadata = new List <IWebHookSecurityMetadata>(codeVerifierMetadata); }
/// <summary> /// Gets the Client ID and Client Secret for the Instagram Client application. /// </summary> /// <param name="id">A (potentially empty) ID of a particular configuration for this WebHook.</param> /// <returns>A <see cref="Tuple{T1,T2}"/> containing the Client ID and Client Secret.</returns> protected virtual async Task <Tuple <string, string> > GetClientConfig(string id) { IWebHookReceiverConfig receiverConfig = _config.DependencyResolver.GetReceiverConfig(); string clientId = await receiverConfig.GetReceiverConfigAsync(ClientIdKey, id, InstagramWebHookReceiver.SecretMinLength, InstagramWebHookReceiver.SecretMaxLength); ValidateConfig(ClientIdKey, clientId, id, InstagramWebHookReceiver.SecretMinLength, InstagramWebHookReceiver.SecretMaxLength); string clientSecret = await receiverConfig.GetReceiverConfigAsync(InstagramWebHookReceiver.ReceiverName, id, InstagramWebHookReceiver.SecretMinLength, InstagramWebHookReceiver.SecretMaxLength); ValidateConfig(InstagramWebHookReceiver.ReceiverName, clientSecret, id, InstagramWebHookReceiver.SecretMinLength, InstagramWebHookReceiver.SecretMaxLength); return(Tuple.Create(clientId, clientSecret)); }
public void SetReceiverConfig_GetReceiverConfig_Roundtrips() { // Arrange SettingsDictionary settings = CommonServices.GetSettings(); ILogger logger = CommonServices.GetLogger(); Mock <IWebHookReceiverConfig> configMock = new Mock <IWebHookReceiverConfig>(); // Act ReceiverServices.SetReceiverConfig(configMock.Object); IWebHookReceiverConfig actual = ReceiverServices.GetReceiverConfig(settings, logger); // Assert Assert.Same(configMock.Object, actual); }
/// <summary> /// Instantiates a new <see cref="WebHookGetResponseFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// <param name="metadata">The collection of <see cref="IWebHookMetadata"/> services.</param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> public WebHookGetResponseFilter( ILoggerFactory loggerFactory, IEnumerable <IWebHookMetadata> metadata, IWebHookReceiverConfig receiverConfig) : base(loggerFactory, receiverConfig) { // No need to keep track of IWebHookSecurityMetadata instances that do not request HTTP GET request // handling. var codeVerifierMetadata = metadata .OfType <IWebHookSecurityMetadata>() .Where(item => item.ShortCircuitGetRequests); _getRequestMetadata = new List <IWebHookSecurityMetadata>(codeVerifierMetadata); }
/// <summary> /// Instantiates a new <see cref="WebHookSecurityFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="Logger"/>. /// </param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize <see cref="Configuration"/> and /// <see cref="ReceiverConfig"/>. /// </param> protected WebHookSecurityFilter(ILoggerFactory loggerFactory, IWebHookReceiverConfig receiverConfig) { if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } if (receiverConfig == null) { throw new ArgumentNullException(nameof(receiverConfig)); } Logger = loggerFactory.CreateLogger(GetType()); ReceiverConfig = receiverConfig; }
/// <summary> /// Instantiates a new <see cref="SalesforceVerifyOrganizationIdFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param> /// <param name="optionsAccessor"> /// The <see cref="IOptions{MvcOptions}"/> accessor for <see cref="MvcOptions"/>. /// </param> /// <param name="readerFactory">The <see cref="IHttpRequestStreamReaderFactory"/>.</param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> /// <param name="resultCreator">The <see cref="ISalesforceResultCreator"/>.</param> public SalesforceVerifyOrganizationIdFilter( ILoggerFactory loggerFactory, IModelMetadataProvider metadataProvider, IOptions <MvcOptions> optionsAccessor, IHttpRequestStreamReaderFactory readerFactory, IWebHookReceiverConfig receiverConfig, ISalesforceResultCreator resultCreator) : base(loggerFactory, receiverConfig) { var options = optionsAccessor.Value; _bodyModelBinder = new BodyModelBinder(options.InputFormatters, readerFactory, loggerFactory, options); _resultCreator = resultCreator; _xElementMetadata = metadataProvider.GetMetadataForType(typeof(XElement)); }
// Allow tests to override the HttpClient. internal StripeVerifyNotificationIdFilter( ILoggerFactory loggerFactory, IModelMetadataProvider metadataProvider, IOptions <MvcOptions> optionsAccessor, IHttpRequestStreamReaderFactory readerFactory, IWebHookReceiverConfig receiverConfig, HttpClient httpClient) : base(loggerFactory, receiverConfig) { var options = optionsAccessor.Value; _bodyModelBinder = new BodyModelBinder(options.InputFormatters, readerFactory, loggerFactory, options); _httpClient = httpClient ?? new HttpClient(); _jObjectMetadata = metadataProvider.GetMetadataForType(typeof(JObject)); _passThroughTestEvents = receiverConfig.IsTrue(StripeConstants.PassThroughTestEventsConfigurationKey); _useDirectWebHook = receiverConfig.IsTrue(StripeConstants.DirectWebHookConfigurationKey); }
/// <summary> /// Resets all values for testing purposes. /// </summary> internal static void Reset() { _receiverManager = null; _receiverConfig = null; _handlerSorter = null; _receivers = null; _handlers = null; }
/// <summary> /// Instantiates a new <see cref="WebHookVerifyBodyContentFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> protected WebHookVerifyBodyContentFilter(ILoggerFactory loggerFactory, IWebHookReceiverConfig receiverConfig) : base(loggerFactory, receiverConfig) { }
/// <summary> /// Instantiates a new <see cref="DropboxVerifySignatureFilter"/> instance. /// </summary> /// <param name="loggerFactory"> /// The <see cref="ILoggerFactory"/> used to initialize <see cref="WebHookSecurityFilter.Logger"/>. /// </param> /// <param name="receiverConfig"> /// The <see cref="IWebHookReceiverConfig"/> used to initialize /// <see cref="WebHookSecurityFilter.Configuration"/> and <see cref="WebHookSecurityFilter.ReceiverConfig"/>. /// </param> public DropboxVerifySignatureFilter(ILoggerFactory loggerFactory, IWebHookReceiverConfig receiverConfig) : base(loggerFactory, receiverConfig) { }
/// <summary> /// Instantiates a new <see cref="StripeTestEventResponseFilter"/> instance. /// </summary> /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param> /// <param name="receiverConfig">The <see cref="IWebHookReceiverConfig"/>.</param> public StripeTestEventResponseFilter(ILoggerFactory loggerFactory, IWebHookReceiverConfig receiverConfig) { _logger = loggerFactory.CreateLogger <StripeTestEventResponseFilter>(); _passThroughTestEvents = receiverConfig.IsTrue(StripeConstants.PassThroughTestEventsConfigurationKey); }
/// <summary> /// Sets a default <see cref="IWebHookReceiverConfig"/> implementation which is used if none are registered with the /// Dependency Injection engine. /// </summary> /// <param name="instance">The <see cref="IWebHookReceiverConfig"/> to use. If <c>null</c> then a default implementation is used.</param> public static void SetReceiverConfig(IWebHookReceiverConfig instance) { _receiverConfig = instance; }
/// <summary> /// Sets a default <see cref="IWebHookReceiverConfig"/> implementation which is used if none are registered with the /// Dependency Injection engine. /// </summary> /// <param name="instance">The <see cref="IWebHookReceiverConfig"/> to use. If <c>null</c> then a default implementation is used.</param> public static void SetReceiverConfig(IWebHookReceiverConfig instance) { _receiverConfig = instance; }
public void Initialize(string name, string id, string config, params KeyValuePair<Type, object>[] dependencies) { _logger = new Mock<ILogger>().Object; _settings = new SettingsDictionary(); _settings[SecretPrefix + name] = GetConfigValue(id, config); _config = new WebHookReceiverConfig(_settings, _logger); List<KeyValuePair<Type, object>> deps = new List<KeyValuePair<Type, object>>() { new KeyValuePair<Type, object>(typeof(IWebHookReceiverConfig), _config), new KeyValuePair<Type, object>(typeof(SettingsDictionary), _settings) }; deps.AddRange(dependencies); _httpConfig = HttpConfigurationMock.Create(deps); _request = new HttpRequestMessage(); _receiverMock = new WebHookReceiverMock(); _context = new HttpRequestContext { Configuration = _httpConfig }; _request.SetRequestContext(_context); }
/// <summary> /// Instantiates a new <see cref="StripeMetadata"/> instance. /// </summary> public StripeMetadata(IWebHookReceiverConfig receiverConfig) : base(StripeConstants.ReceiverName) { VerifyCodeParameter = receiverConfig.IsTrue(StripeConstants.DirectWebHookConfigurationKey); }