diff --git a/src/main/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt b/src/main/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt index 3bca2f9b..3aa4f16c 100644 --- a/src/main/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt +++ b/src/main/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt @@ -75,7 +75,7 @@ fun validateIamRoleArn(roleArn: String) { require(roleArnRegex.matcher(roleArn).find()) { "Invalid AWS role ARN: $roleArn " } } -fun isValidName(name: String): Boolean { +fun isValidQueryName(name: String): Boolean { // Regex to restrict string so that it cannot start with [_, -, +], // contain two consecutive periods or contain invalid chars val regex = Regex("""^(?![_\-\+])(?!.*\.\.)[^$INVALID_NAME_CHARS]+$""") @@ -83,6 +83,14 @@ fun isValidName(name: String): Boolean { return name.matches(regex) } +fun isValidName(name: String): Boolean { + // Start with letter or underscore + // Followed by letters, numbers, underscore or hyphen + // Total length between 4 and 50 characters + val regex = Regex("^[a-zA-Z_][a-zA-Z0-9_-]{3,49}$") + return name.matches(regex) +} + fun getInvalidNameChars(): String { return INVALID_NAME_CHARS } diff --git a/src/test/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt b/src/test/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt new file mode 100644 index 00000000..de3068a8 --- /dev/null +++ b/src/test/kotlin/org/opensearch/commons/utils/ValidationHelpers.kt @@ -0,0 +1,57 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.commons.utils + +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class ValidationHelpers { + @Test + fun `test valid names`() { + /* Start with letter or underscore + Followed by letters, numbers, underscore or hyphen + Total length between 4 and 50 characters */ + + assertTrue(isValidName("valid")) + assertTrue(isValidName("Valid_name")) + assertTrue(isValidName("valid_name_123")) + assertTrue(isValidName("_validName")) + assertTrue(isValidName("valid_name-123")) + assertTrue(isValidName("_123_valid_name")) + + // Boundary value tests + assertTrue(isValidName("qwer")) + assertTrue(isValidName("q".repeat(50))) + assertTrue(isValidName("____")) + assertTrue(isValidName("a-b-")) + } + + @Test + fun `test invalid names`() { + // Invalid starting characters + assertFalse(isValidName("123name")) + assertFalse(isValidName("-name")) + assertFalse(isValidName("1name")) + + // Should not have invalid characters + assertFalse(isValidName("invalid@name")) + assertFalse(isValidName("invalid name")) + assertFalse(isValidName("invalid#name")) + assertFalse(isValidName("invalid.name")) + assertFalse(isValidName(" ")) + + // Should not allow special characters other than _ and - + assertFalse(isValidName("name!")) + assertFalse(isValidName("name*")) + assertFalse(isValidName("name$")) + assertFalse(isValidName("name%")) + + // Boundary value tests + assertFalse(isValidName("abc")) + assertFalse(isValidName("a".repeat(51))) + } +}