Ejemplo n.º 1
0
    public void GetValidators_CachesAllValidators()
    {
        // Arrange
        var cache             = new ValidatorCache();
        var metadata          = new TestModelMetadataProvider().GetMetadataForProperty(typeof(TypeWithProperty), "Property1");
        var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

        // Act - 1
        var validators1 = cache.GetValidators(metadata, validatorProvider);

        // Assert - 1
        var attribute1 = Assert.IsType <DataAnnotationsModelValidator>(validators1[0]).Attribute;
        var attribute2 = Assert.IsType <DataAnnotationsModelValidator>(validators1[1]).Attribute;

        Assert.Contains(attribute1, metadata.ValidatorMetadata); // Copied by provider
        Assert.Contains(attribute2, metadata.ValidatorMetadata); // Copied by provider

        // Act - 2
        var validators2 = cache.GetValidators(metadata, validatorProvider);

        // Assert - 2
        Assert.Same(validators1, validators2);

        Assert.Contains(validators1[0], validators2); // Cached
        Assert.Contains(validators1[1], validators2); // Cached
    }
Ejemplo n.º 2
0
 public CustomObjectValidator(IModelMetadataProvider modelMetadataProvider, IList <IModelValidatorProvider> validatorProviders)
 {
     _modelMetadataProvider = modelMetadataProvider;
     _validatorProviders    = validatorProviders;
     _validatorCache        = new ValidatorCache();
     _validatorProvider     = new CompositeModelValidatorProvider(validatorProviders);
 }
Ejemplo n.º 3
0
        private ParameterBinder(
            IModelMetadataProvider modelMetadataProvider,
            IModelBinderFactory modelBinderFactory,
            IModelValidatorProvider validatorProvider,
            IObjectModelValidator validatorForBackCompatOnly,
            ILoggerFactory loggerFactory)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (modelBinderFactory == null)
            {
                throw new ArgumentNullException(nameof(modelBinderFactory));
            }

            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            _modelMetadataProvider      = modelMetadataProvider;
            _modelBinderFactory         = modelBinderFactory;
            _validatorProvider          = validatorProvider;
            _validatorForBackCompatOnly = validatorForBackCompatOnly;
            _validatorCache             = new ValidatorCache();
            Logger = loggerFactory.CreateLogger(GetType());
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/> that provides a list of <see cref="IModelValidator"/>s.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitorFork(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidatorCache validatorCache,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (validatorCache == null)
            {
                throw new ArgumentNullException(nameof(validatorCache));
            }

            Context           = actionContext;
            ValidatorProvider = validatorProvider;
            Cache             = validatorCache;

            MetadataProvider = metadataProvider;
            ValidationState  = validationState;

            ModelState  = actionContext.ModelState;
            CurrentPath = new ValidationStack();
        }
Ejemplo n.º 5
0
    public void GetValidators_DoesNotCacheValidatorsWithIsReusableFalse()
    {
        // Arrange
        var cache             = new ValidatorCache();
        var metadata          = new TestModelMetadataProvider().GetMetadataForProperty(typeof(TypeWithProperty), "Property1");
        var validatorProvider = new ProviderWithNonReusableValidators();

        // Act - 1
        var validators1 = cache.GetValidators(metadata, validatorProvider);

        // Assert - 1
        var validator1 = Assert.IsType <DataAnnotationsModelValidator>(validators1[0]);
        var validator2 = Assert.IsType <DataAnnotationsModelValidator>(validators1[1]);

        Assert.Contains(validator1.Attribute, metadata.ValidatorMetadata); // Copied by provider
        Assert.Contains(validator2.Attribute, metadata.ValidatorMetadata); // Copied by provider

        // Act - 2
        var validators2 = cache.GetValidators(metadata, validatorProvider);

        // Assert - 2
        Assert.NotSame(validators1, validators2);

        var requiredValidator = Assert.Single(validators2.Where(v => (v as DataAnnotationsModelValidator).Attribute is RequiredAttribute));

        Assert.Contains(requiredValidator, validators1); // cached
        var stringLengthValidator = Assert.Single(validators2.Where(v => (v as DataAnnotationsModelValidator).Attribute is StringLengthAttribute));

        Assert.DoesNotContain(stringLengthValidator, validators1); // not cached
    }
Ejemplo n.º 6
0
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/> that provides a list of <see cref="IModelValidator"/>s.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
#pragma warning disable PUB0001 // Pubternal type in public API
            ValidatorCache validatorCache,
#pragma warning restore PUB0001
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (validatorCache == null)
            {
                throw new ArgumentNullException(nameof(validatorCache));
            }

            Context           = actionContext;
            ValidatorProvider = validatorProvider;
            Cache             = validatorCache;

            MetadataProvider = metadataProvider;
            ValidationState  = validationState;

            ModelState  = actionContext.ModelState;
            CurrentPath = new ValidationStack();
        }
Ejemplo n.º 7
0
        private async Task ExecValidators(object request)
        {
            var feature = HostContext.GetPlugin <ValidationFeature>();

            if (feature != null)
            {
                var validator = ValidatorCache.GetValidator(req, request.GetType());
                if (validator != null)
                {
                    var ruleSet           = (string)(req.GetItem(Keywords.InvokeVerb) ?? req.Verb);
                    var validationContext = new ValidationContext(request, null, new MultiRuleSetValidatorSelector(ruleSet))
                    {
                        Request = req
                    };

                    ValidationResult result;
                    if (!validator.HasAsyncValidators(validationContext))
                    {
                        result = validator.Validate(validationContext);
                    }
                    else
                    {
                        result = await validator.ValidateAsync(validationContext);
                    }

                    if (!result.IsValid)
                    {
                        throw result.ToWebServiceException(request, feature);
                    }
                }
            }
        }
Ejemplo n.º 8
0
 /// <summary>
 ///     Initializes a new instance of <see cref="FluentValidationObjectModelValidator" />.
 /// </summary>
 public FluentValidationObjectModelValidator(IModelMetadataProvider modelMetadataProvider,
                                             IList <IModelValidatorProvider> validatorProviders)
 {
     _modelMetadataProvider =
         modelMetadataProvider ?? throw new ArgumentNullException(nameof(modelMetadataProvider));
     _validatorCache    = new ValidatorCache();
     _validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
 }
        /// <summary>
        /// Gets a <see cref="ValidationVisitor"/> that traverses the object model graph and performs validation.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/>.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/>.</param>
        /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        /// <returns>A <see cref="ValidationVisitor"/> which traverses the object model graph.</returns>
        public abstract ValidationVisitor GetValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
#pragma warning disable PUB0001 // Pubternal type in public API
            ValidatorCache validatorCache,
#pragma warning restore PUB0001
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState);
 public FixedValidationVisitor(
     ActionContext actionContext,
     IModelValidatorProvider validatorProvider,
     ValidatorCache validatorCache,
     IModelMetadataProvider metadataProvider,
     ValidationStateDictionary validationState)
     : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
 }
        public void Setup()
        {
            BaselineModelMetadataProvider = CreateModelMetadataProvider(addHasValidatorsProvider: false);
            ModelMetadataProvider         = CreateModelMetadataProvider(addHasValidatorsProvider: true);

            BaselineModelMetadata = BaselineModelMetadataProvider.GetMetadataForType(Model.GetType());
            ModelMetadata         = ModelMetadataProvider.GetMetadataForType(Model.GetType());
            ActionContext         = GetActionContext();
            ValidatorCache        = new ValidatorCache();
        }
 public CustomValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState, IValidatorFactory validatorFactory, CustomizeValidatorAttribute cutomizations) : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
     _modelState        = actionContext.ModelState;
     _validatorCache    = validatorCache;
     _metadataProvider  = metadataProvider;
     _validatorFactory  = validatorFactory;
     _cutomizations     = cutomizations;
     _actionContext     = actionContext;
     _validatorProvider = validatorProvider;
 }
 public FluentValidationObjectModelValidator(
     IModelMetadataProvider modelMetadataProvider,
     IList <IModelValidatorProvider> validatorProviders, bool runMvcValidation, bool implicitValidationEnabled)
     : base(modelMetadataProvider, validatorProviders)
 {
     _runMvcValidation          = runMvcValidation;
     _implicitValidationEnabled = implicitValidationEnabled;
     _validatorCache            = new ValidatorCache();
     _fvProvider = validatorProviders.SingleOrDefault(x => x is FluentValidationModelValidatorProvider) as FluentValidationModelValidatorProvider;
 }
Ejemplo n.º 14
0
        /// <summary>
        ///     Initializes a new instance of <see cref="FluentValidationObjectModelValidator" />.
        /// </summary>
        public FluentValidationObjectModelValidator(IModelMetadataProvider modelMetadataProvider, IList <IModelValidatorProvider> validatorProviders,
                                                    IValidatorFactory validatorFactory)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            _validatorFactory      = validatorFactory;
            _modelMetadataProvider = modelMetadataProvider;
            _validatorCache        = new ValidatorCache();
            _validatorProvider     = new CompositeModelValidatorProvider(validatorProviders);
        }
Ejemplo n.º 15
0
        public ObjectModelValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList <IModelValidatorProvider> validatorProviders)
        {
            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            this.modelMetadataProvider = modelMetadataProvider ?? throw new ArgumentNullException(nameof(modelMetadataProvider));
            this.validatorCache        = new ValidatorCache();

            this.validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
        }
Ejemplo n.º 16
0
 /// <summary>
 /// Gets a <see cref="ValidationVisitor"/> that traverses the object model graph and performs validation.
 /// </summary>
 /// <param name="actionContext">The <see cref="ActionContext"/>.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
 /// <param name="validatorCache">The <see cref="ValidatorCache"/>.</param>
 /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
 /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
 /// <returns>A <see cref="ValidationVisitor"/> which traverses the object model graph.</returns>
 public ValidationVisitor GetValidationVisitor(
     ActionContext actionContext,
     IModelValidatorProvider validatorProvider,
     ValidatorCache validatorCache,
     IModelMetadataProvider metadataProvider,
     ValidationStateDictionary validationState)
 {
     return(new SignumValidationVisitor(
                actionContext,
                validatorProvider,
                validatorCache,
                metadataProvider,
                validationState));
 }
        public override ValidationVisitor GetValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidatorCache validatorCache,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            var visitor = new ValidationVisitor(
                actionContext,
                validatorProvider,
                validatorCache,
                metadataProvider,
                validationState);

            visitor.MaxValidationDepth = _mvcOptions.MaxValidationDepth;

            return(visitor);
        }
        public EnhancedObjectValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList <IModelValidatorProvider> validatorProviders)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            _modelMetadataProvider = modelMetadataProvider;
            _validatorCache        = new ValidatorCache();

            _validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
        }
Ejemplo n.º 19
0
        public override ValidationVisitor GetValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidatorCache validatorCache,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            var visitor = new ValidationVisitor(
                actionContext,
                validatorProvider,
                validatorCache,
                metadataProvider,
                validationState);

            visitor.MaxValidationDepth = _mvcOptions.MaxValidationDepth;
            visitor.AllowShortCircuitingValidationWhenNoValidatorsArePresent = _mvcOptions.AllowShortCircuitingValidationWhenNoValidatorsArePresent;

            return(visitor);
        }
        public FluentValidationObjectModelValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList <IModelValidatorProvider> validatorProviders, bool runMvcValidation)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            _modelMetadataProvider = modelMetadataProvider;
            _runMvcValidation      = runMvcValidation;
            _validatorCache        = new ValidatorCache();
            _fvProvider            = validatorProviders.SingleOrDefault(x => x is FluentValidationModelValidatorProvider) as FluentValidationModelValidatorProvider;
            _compositeProvider     = new CompositeModelValidatorProvider(validatorProviders);         //.Except(new IModelValidatorProvider[]{ _fvProvider }).ToList());
        }
Ejemplo n.º 21
0
    public override ValidationVisitor GetValidationVisitor(
        ActionContext actionContext,
        IModelValidatorProvider validatorProvider,
        ValidatorCache validatorCache,
        IModelMetadataProvider metadataProvider,
        ValidationStateDictionary?validationState)
    {
        var visitor = new ValidationVisitor(
            actionContext,
            validatorProvider,
            validatorCache,
            metadataProvider,
            validationState)
        {
            MaxValidationDepth = _mvcOptions.MaxValidationDepth,
            ValidateComplexTypesIfChildValidationFails = _mvcOptions.ValidateComplexTypesIfChildValidationFails,
        };

        return(visitor);
    }
Ejemplo n.º 22
0
        private TResponse ExecSync <TResponse>(object request)
        {
            if (HostContext.AppHost.GatewayRequestFilter != null)
            {
                HostContext.AppHost.GatewayRequestFilter(req, request);
                if (req.Response.IsClosed)
                {
                    return(default(TResponse));
                }
            }

            if (HostContext.HasPlugin <ValidationFeature>())
            {
                var validator = ValidatorCache.GetValidator(req, request.GetType());
                if (validator != null)
                {
                    var ruleSet = (string)(req.GetItem(Keywords.InvokeVerb) ?? req.Verb);
                    var result  = validator.Validate(new ValidationContext(
                                                         request, null, new MultiRuleSetValidatorSelector(ruleSet))
                    {
                        Request = req
                    });
                    if (!result.IsValid)
                    {
                        throw new ValidationException(result.Errors);
                    }
                }
            }

            var response     = HostContext.ServiceController.Execute(request, req);
            var responseTask = response as Task;

            if (responseTask != null)
            {
                response = responseTask.GetResult();
            }

            return(ConvertToResponse <TResponse>(response));
        }
        public override ValidationVisitor GetValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState)
        {
            // Setting as to whether we should run only FV or FV + the other validator providers
            var validatorProviderToUse = _runMvcValidation ? validatorProvider : _fvProvider;

            var visitor = new FluentValidationVisitor(
                actionContext,
                validatorProviderToUse,
                validatorCache,
                metadataProvider,
                validationState);

            return(visitor);
        }
Ejemplo n.º 24
0
 /// <summary>
 /// Gets a <see cref="ValidationVisitor"/> that traverses the object model graph and performs validation.
 /// </summary>
 /// <param name="actionContext">The <see cref="ActionContext"/>.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
 /// <param name="validatorCache">The <see cref="ValidatorCache"/>.</param>
 /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
 /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
 /// <returns>A <see cref="ValidationVisitor"/> which traverses the object model graph.</returns>
 public abstract ValidationVisitor GetValidationVisitor(
     ActionContext actionContext,
     IModelValidatorProvider validatorProvider,
     ValidatorCache validatorCache,
     IModelMetadataProvider metadataProvider,
     ValidationStateDictionary validationState);
 public OverrideValidationVisitor(IEnumerable <ISkipValidation> skipValidations, ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState) : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
     SkipValidations = skipValidations;
 }
 public override ValidationVisitor GetValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState)
 {
     return(new CustomValidationVisitor(
                actionContext,
                validatorProvider,
                validatorCache,
                _customModelMetadataProvider,
                validationState));
 }
 public CustomValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, ICustomModelMetadataProviderSingleton metadataProvider, ValidationStateDictionary validationState)
     : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
 }
Ejemplo n.º 28
0
 public FluentValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState)
     : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
     ValidateComplexTypesIfChildValidationFails = true;
 }
Ejemplo n.º 29
0
 public DynamicFormsValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IDynamicFormsModelMetadataProviderSingleton metadataProvider, ValidationStateDictionary validationState)
     : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
 }