/// <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); }
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); }
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; } }