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