示例#1
0
 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);
         }
     }
 }
示例#2
0
        /// <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);
                }
            }
        }
示例#3
0
 /// <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);
 }