private void AddReceiverFilters(ActionModel action, IList <IFilterMetadata> filters) { if (action.Properties.TryGetValue(typeof(IWebHookFilterMetadata), out var filterMetadataObject) && filterMetadataObject is IWebHookFilterMetadata filterMetadata) { var context = new WebHookFilterMetadataContext(action); filterMetadata.AddFilters(context); foreach (var filter in context.Results) { filters.Add(filter); } } }
/// <inheritdoc /> public void OnProvidersExecuting(FilterProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var actionContext = context.ActionContext; if (!actionContext.RouteData.TryGetWebHookReceiverName(out var recieverName)) { // Not a WebHook request. return; } var actionDescriptor = actionContext.ActionDescriptor; var bodyTypeMetadataObject = actionDescriptor.Properties[typeof(IWebHookBodyTypeMetadataService)]; if (bodyTypeMetadataObject is IWebHookBodyTypeMetadataService) { // Action is receiver-specific. WebHookFilterProvider already added the necessary filters. return; } var filterMetadata = _metadataProvider.GetFilterMetadata(recieverName); if (filterMetadata == null) { // No need for receiver-specific filters. return; } var providerContext = new WebHookFilterMetadataContext(actionDescriptor); filterMetadata.AddFilters(providerContext); if (providerContext.Results.Count == 0) { // No receiver-specific filters to add. return; } // Treat all WebHook filters as if they have FilterScope.Action. DefaultFilterProvider will fill in // FilterItem.Filter, usually copying FilterDescriptor.Filter. var newFilterItems = providerContext.Results .Select(filter => new FilterItem(new FilterDescriptor(filter, FilterScope.Action)) { IsReusable = false, }); // MVC sorts context.Results before calling IFilterProvider implementations. Assume nothing has disturbed // that order: Insert results and do not re-sort the whole collection. var itemsList = context.Results as List <FilterItem> ?? new List <FilterItem>(context.Results); context.Results = itemsList; foreach (var newFilterItem in newFilterItems) { var position = itemsList.BinarySearch(newFilterItem, FilterItemComparer.Instance); if (position >= 0) { // Insert after the match. itemsList.Insert(position + 1, newFilterItem); } else { itemsList.Insert(~position, newFilterItem); } } }
/// <summary> /// Add <see cref="IFilterMetadata"/> instances to <see cref="WebHookFilterMetadataContext.Results"/> of <paramref name="context"/>. /// </summary> /// <param name="context">The <see cref="WebHookFilterMetadataContext"/> for the action.</param> public void AddFilters(WebHookFilterMetadataContext context) { context.Results.Add(_securityFilter); context.Results.Add(_intentVerificationFilter); }
public void AddFilters(WebHookFilterMetadataContext context) { context.Results.Add(this.verifySignatureFilter); }
/// <inheritdoc /> public void AddFilters(WebHookFilterMetadataContext context) { context.Results.Add(_fitbitVerifySubscriberFilter); context.Results.Add(_fitbitVerifySignatureFilter); context.Results.Add(_fitbitActionResultFilter); }