Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
 /// <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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 11
0
        /// <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);
        }
Esempio n. 13
0
        /// <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);
        }
Esempio n. 14
0
        /// <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);
        }
Esempio n. 17
0
 /// <summary>
 /// Resets all values for testing purposes.
 /// </summary>
 internal static void Reset()
 {
     _receiverManager = null;
     _receiverConfig = null;
     _handlerSorter = null;
     _receivers = null;
     _handlers = null;
 }
Esempio n. 18
0
 /// <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)
 {
 }
Esempio n. 19
0
 /// <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);
 }
Esempio n. 21
0
 /// <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;
 }
Esempio n. 22
0
 /// <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;
 }
Esempio n. 23
0
        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);
        }
Esempio n. 24
0
 /// <summary>
 /// Instantiates a new <see cref="StripeMetadata"/> instance.
 /// </summary>
 public StripeMetadata(IWebHookReceiverConfig receiverConfig)
     : base(StripeConstants.ReceiverName)
 {
     VerifyCodeParameter = receiverConfig.IsTrue(StripeConstants.DirectWebHookConfigurationKey);
 }