Beispiel #1
0
    public string Sanitize(string entityPathOrName, EntityType entityType)
    {
        // remove invalid characters
        var regex = new Regex(@"[^a-zA-Z0-9\-\._]");

        entityPathOrName = regex.Replace(entityPathOrName, string.Empty);

        var entityPathOrNameMaxLength = 0;

        switch (entityType)
        {
        case EntityType.Queue:
        case EntityType.Topic:
            entityPathOrNameMaxLength = 260;
            break;

        case EntityType.Subscription:
        case EntityType.Rule:
            entityPathOrNameMaxLength = 50;
            break;
        }

        // hash if still too long
        if (entityPathOrName.Length > entityPathOrNameMaxLength)
        {
            entityPathOrName = MD5DeterministicNameBuilder.Build(entityPathOrName);
        }

        return(entityPathOrName);
    }
Beispiel #2
0
            public string Sanitize(string entityPathOrName, EntityType entityType)
            {
                var entityPathOrNameMaxLength = 0;

                switch (entityType)
                {
                case EntityType.Queue:
                case EntityType.Topic:
                case EntityType.Subscription:
                case EntityType.Rule:
                    entityPathOrNameMaxLength = 50;
                    break;
                }

                if (entityPathOrName.Length > entityPathOrNameMaxLength)
                {
                    var pathWithoutNamespaceHierarchyPrefix = entityPathOrName.Remove(0, NamespaceHierarchyPrefix.Length);
                    entityPathOrName = MD5DeterministicNameBuilder.Build(pathWithoutNamespaceHierarchyPrefix);

                    // sanitization took place, restore namespace hierarchy prefix
                    if (entityType == EntityType.Queue || entityType == EntityType.Topic)
                    {
                        return($"{NamespaceHierarchyPrefix}{entityPathOrName}");
                    }
                }

                return(entityPathOrName);
            }
        public void Should_sanitize_longer_than_maximum_path_or_name(string entityPathOrName, EntityType entityType)
        {
            var settings     = DefaultConfigurationValues.Apply(SettingsHolderFactory.BuildWithSerializer());
            var sanitization = new ValidateAndHashIfNeeded(settings);

            var sanitizedResult = sanitization.Sanitize(entityPathOrName, entityType);

            var expectedPathOrName = MD5DeterministicNameBuilder.Build(entityPathOrName);

            Assert.That(sanitizedResult, Is.EqualTo(expectedPathOrName));
        }
Beispiel #4
0
        public ValidateAndHashIfNeeded(ReadOnlySettings settings)
        {
            this.settings = settings;

            // validators

            defaultQueuePathValidation = queuePath =>
            {
                var validationResult = new ValidationResult();

                if (!queueAndTopicPathValidationRegex.IsMatch(queuePath))
                {
                    validationResult.AddErrorForInvalidCharacters($"Queue path {queuePath} contains illegal characters. Legal characters should match the following regex: `{queuePath}`.");
                }

                var maximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.QueuePathMaximumLength);
                if (queuePath.Length > maximumLength)
                {
                    validationResult.AddErrorForInvalidLenth($"Queue path `{queuePath}` exceeds maximum length of {maximumLength} characters.");
                }

                return(validationResult);
            };

            defaultTopicPathValidation = topicPath =>
            {
                var validationResult = new ValidationResult();

                if (!queueAndTopicPathValidationRegex.IsMatch(topicPath))
                {
                    validationResult.AddErrorForInvalidCharacters($"Topic path {topicPath} contains illegal characters. Legal characters should match the following regex: `{topicPath}`.");
                }

                var maximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.TopicPathMaximumLength);
                if (topicPath.Length > maximumLength)
                {
                    validationResult.AddErrorForInvalidLenth($"Topic path `{topicPath}` exceeds maximum length of {maximumLength} characters.");
                }

                return(validationResult);
            };

            defaultSubscriptionNameValidation = subscriptionName =>
            {
                var validationResult = new ValidationResult();

                if (!subscriptionAndRuleNameValidationRegex.IsMatch(subscriptionName))
                {
                    validationResult.AddErrorForInvalidCharacters($"Subscription name {subscriptionName} contains illegal characters. Legal characters should match the following regex: `{subscriptionName}`.");
                }

                var maximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.SubscriptionNameMaximumLength);
                if (subscriptionName.Length > maximumLength)
                {
                    validationResult.AddErrorForInvalidLenth($"Subscription name `{subscriptionName}` exceeds maximum length of {maximumLength} characters.");
                }

                return(validationResult);
            };

            defaultRuleNameValidation = ruleName =>
            {
                var validationResult = new ValidationResult();

                if (!subscriptionAndRuleNameValidationRegex.IsMatch(ruleName))
                {
                    validationResult.AddErrorForInvalidCharacters($"Rule name {ruleName} contains illegal characters. Legal characters should match the following regex: `{ruleName}`.");
                }

                var maximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.RuleNameMaximumLength);
                if (ruleName.Length > maximumLength)
                {
                    validationResult.AddErrorForInvalidLenth($"Rule name `{ruleName}` exceeds maximum length of {maximumLength} characters.");
                }

                return(validationResult);
            };

            // sanitizers

            defaultQueuePathSanitization        = queuePath => queueAndTopicPathSanitizationRegex.Replace(queuePath, string.Empty);
            defaultTopicPathSanitization        = topicPath => queueAndTopicPathSanitizationRegex.Replace(topicPath, string.Empty);
            defaultSubscriptionNameSanitization = subscriptionPath => subscriptionAndRuleNameSanitizationRegex.Replace(subscriptionPath, string.Empty);
            defaultRuleNameSanitization         = rulePath => subscriptionAndRuleNameSanitizationRegex.Replace(rulePath, string.Empty);

            // hash
            defaultHashing = entityPathOrName => MD5DeterministicNameBuilder.Build(entityPathOrName);
        }
Beispiel #5
0
 public static void ConfigureNameShorteners(this TransportExtensions <AzureServiceBusTransport> transport)
 {
     transport.SubscriptionNameShortener(n => n.Length > MaxEntityName ? MD5DeterministicNameBuilder.Build(n) : n);
     transport.RuleNameShortener(n => n.Length > MaxEntityName ? MD5DeterministicNameBuilder.Build(n) : n);
 }
Beispiel #6
0
        internal ValidateAndHashIfNeeded(ReadOnlySettings settings)
        {
            var maximumQueuePathLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.QueuePathMaximumLength);

            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.QueuePathValidator, out queuePathValidation))
            {
                queuePathValidation = queuePath =>
                {
                    ValidationResult validationResult = null;

                    if (!queueAndTopicPathValidationRegex.IsMatch(queuePath))
                    {
                        validationResult = new ValidationResult();
                        validationResult.AddErrorForInvalidCharacters($"Queue path {queuePath} contains illegal characters. Legal characters should match the following regex: `{queueAndTopicPathValidationRegex}`.");
                    }

                    if (queuePath.Length > maximumQueuePathLength)
                    {
                        validationResult = validationResult ?? new ValidationResult();
                        validationResult.AddErrorForInvalidLength($"Queue path `{queuePath}` exceeds maximum length of {maximumQueuePathLength} characters.");
                    }

                    return(validationResult ?? ValidationResult.Empty);
                };
            }
            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.QueuePathSanitizer, out queuePathSanitization))
            {
                queuePathSanitization = queuePath => queueAndTopicPathSanitizationRegex.Replace(queuePath, string.Empty);
            }

            var topicPathMaximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.TopicPathMaximumLength);

            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.TopicPathValidator, out topicPathValidation))
            {
                topicPathValidation = topicPath =>
                {
                    ValidationResult validationResult = null;

                    if (!queueAndTopicPathValidationRegex.IsMatch(topicPath))
                    {
                        validationResult = new ValidationResult();
                        validationResult.AddErrorForInvalidCharacters($"Topic path {topicPath} contains illegal characters. Legal characters should match the following regex: `{queueAndTopicPathValidationRegex}`.");
                    }


                    if (topicPath.Length > topicPathMaximumLength)
                    {
                        validationResult = validationResult ?? new ValidationResult();
                        validationResult.AddErrorForInvalidLength($"Topic path `{topicPath}` exceeds maximum length of {topicPathMaximumLength} characters.");
                    }

                    return(validationResult ?? ValidationResult.Empty);
                };
            }
            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.TopicPathSanitizer, out topicPathSanitization))
            {
                topicPathSanitization = topicPath => queueAndTopicPathSanitizationRegex.Replace(topicPath, string.Empty);
            }

            var subscriptionNameMaximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.SubscriptionNameMaximumLength);

            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.SubscriptionNameValidator, out subscriptionNameValidation))
            {
                subscriptionNameValidation = subscriptionName =>
                {
                    ValidationResult validationResult = null;

                    if (!subscriptionAndRuleNameValidationRegex.IsMatch(subscriptionName))
                    {
                        validationResult = new ValidationResult();
                        validationResult.AddErrorForInvalidCharacters($"Subscription name {subscriptionName} contains illegal characters. Legal characters should match the following regex: `{subscriptionAndRuleNameValidationRegex}`.");
                    }


                    if (subscriptionName.Length > subscriptionNameMaximumLength)
                    {
                        validationResult = validationResult ?? new ValidationResult();
                        validationResult.AddErrorForInvalidLength($"Subscription name `{subscriptionName}` exceeds maximum length of {subscriptionNameMaximumLength} characters.");
                    }

                    return(validationResult ?? ValidationResult.Empty);
                };
            }
            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.SubscriptionNameSanitizer, out subscriptionNameSanitization))
            {
                subscriptionNameSanitization = subscriptionPath => subscriptionAndRuleNameSanitizationRegex.Replace(subscriptionPath, string.Empty);
            }

            var ruleNameMaximumLength = settings.GetOrDefault <int>(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.RuleNameMaximumLength);

            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.RuleNameValidator, out ruleNameValidation))
            {
                ruleNameValidation = ruleName =>
                {
                    ValidationResult validationResult = null;

                    if (!subscriptionAndRuleNameValidationRegex.IsMatch(ruleName))
                    {
                        validationResult = new ValidationResult();
                        validationResult.AddErrorForInvalidCharacters($"Rule name {ruleName} contains illegal characters. Legal characters should match the following regex: `{subscriptionAndRuleNameValidationRegex}`.");
                    }

                    if (ruleName.Length > ruleNameMaximumLength)
                    {
                        validationResult = validationResult ?? new ValidationResult();
                        validationResult.AddErrorForInvalidLength($"Rule name `{ruleName}` exceeds maximum length of {ruleNameMaximumLength} characters.");
                    }

                    return(validationResult ?? ValidationResult.Empty);
                };
            }
            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.RuleNameSanitizer, out ruleNameSanitization))
            {
                ruleNameSanitization = rulePath => subscriptionAndRuleNameSanitizationRegex.Replace(rulePath, string.Empty);
            }

            if (!settings.TryGet(WellKnownConfigurationKeys.Topology.Addressing.Sanitization.Hash, out hashing))
            {
                hashing = entityPathOrName => MD5DeterministicNameBuilder.Build(entityPathOrName);
            }
        }