/// <summary>
        /// Instantiates a new <see cref="WebHookVerifyRequiredValueFilter"/> instance to verify the given
        /// <paramref name="bindingMetadata"/>.
        /// </summary>
        /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
        /// <param name="bindingMetadata">The receiver's <see cref="IWebHookBindingMetadata"/>.</param>
        public WebHookVerifyRequiredValueFilter(
            ILoggerFactory loggerFactory,
            IWebHookBindingMetadata bindingMetadata)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }
            if (bindingMetadata == null)
            {
                throw new ArgumentNullException(nameof(bindingMetadata));
            }

            _bindingMetadata = bindingMetadata;
            _logger          = loggerFactory.CreateLogger <WebHookVerifyRequiredValueFilter>();
        }
        private static bool TrySourceAdditionalParameter(
            BindingInfo bindingInfo,
            IWebHookBindingMetadata bindingMetadata,
            string parameterName)
        {
            var parameter = bindingMetadata?.Parameters
                            .FirstOrDefault(item => string.Equals(parameterName, item.Name, StringComparison.OrdinalIgnoreCase));

            if (parameter == null)
            {
                return(false);
            }

            bindingInfo.BinderModelName = parameter.SourceName;
            bindingInfo.BindingSource   = parameter.IsQueryParameter ? BindingSource.Query : BindingSource.Header;

            return(true);
        }
Пример #3
0
        private static bool TrySourceAdditionalParameter(
            BindingInfo bindingInfo,
            IWebHookBindingMetadata bindingMetadata,
            string parameterName)
        {
            var parameter = bindingMetadata?.Parameters
                            .FirstOrDefault(item => string.Equals(parameterName, item.Name, StringComparison.OrdinalIgnoreCase));

            if (parameter == null)
            {
                return(false);
            }

            bindingInfo.BinderModelName = parameter.SourceName;
            switch (parameter.ParameterType)
            {
            case WebHookParameterType.Header:
                bindingInfo.BindingSource = BindingSource.Header;
                break;

            case WebHookParameterType.RouteValue:
                bindingInfo.BindingSource = BindingSource.Path;
                break;

            case WebHookParameterType.QueryParameter:
                bindingInfo.BindingSource = BindingSource.Query;
                break;

            default:
                var message = string.Format(
                    CultureInfo.CurrentCulture,
                    Resources.General_InvalidEnumValue,
                    nameof(WebHookParameterType),
                    parameter.ParameterType);
                throw new InvalidOperationException(message);
            }

            return(true);
        }
Пример #4
0
        private void Apply(
            IWebHookBindingMetadata bindingMetadata,
            IWebHookRequestMetadata requestMetadata,
            ParameterModel parameter)
        {
            var bindingInfo = parameter.BindingInfo;

            if (bindingInfo?.BinderModelName != null ||
                bindingInfo?.BinderType != null ||
                bindingInfo?.BindingSource != null)
            {
                // User was explicit. Nothing to do.
                return;
            }

            if (bindingInfo == null)
            {
                bindingInfo = parameter.BindingInfo = new BindingInfo();
            }

            var parameterName = parameter.ParameterName;
            var parameterType = parameter.ParameterInfo.ParameterType;

            switch (parameterName.ToUpperInvariant())
            {
            case "ACTION":
            case "ACTIONS":
            case "ACTIONNAME":
            case "ACTIONNAMES":
                SourceEvent(bindingInfo, parameterType);
                break;

            case "DATA":
                SourceData(bindingInfo, requestMetadata);
                break;

            case "EVENT":
            case "EVENTS":
            case "EVENTNAME":
            case "EVENTNAMES":
                SourceEvent(bindingInfo, parameterType);
                break;

            case "ID":
                SourceId(bindingInfo, parameterType);
                break;

            case "RECEIVER":
            case "RECEIVERNAME":
                SourceReceiver(bindingInfo, parameterType);
                break;

            case "RECEIVERID":
                SourceId(bindingInfo, parameterType);
                break;

            case "WEBHOOKRECEIVER":
                SourceReceiver(bindingInfo, parameterType);
                break;

            default:
                // If additional parameters are configured and match, map them. If not, treat IFormCollection,
                // JContainer and XElement parameters as data. IsAssignableFrom(...) looks reversed because this
                // check is about model binding system support, not an actual assignment to the parameter.
                if (!TrySourceAdditionalParameter(bindingInfo, bindingMetadata, parameterName) &&
                    (typeof(IFormCollection).IsAssignableFrom(parameterType) ||
                     // ??? Any need to support simple JToken's? JContainer is the base for JArray and JObject.
                     typeof(JContainer).IsAssignableFrom(parameterType) ||
                     typeof(XElement).IsAssignableFrom(parameterType)))
                {
                    SourceData(bindingInfo, requestMetadata);
                }
                break;
            }
        }