diff --git a/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocation.kt b/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocation.kt index 709938ce4..45f936863 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocation.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocation.kt @@ -12,9 +12,7 @@ */ package de.bixilon.minosoft.data.registries.identified -import de.bixilon.minosoft.config.StaticConfiguration import de.bixilon.minosoft.data.language.translate.Translatable -import de.bixilon.minosoft.data.registries.identified.ResourceLocation.Companion.ALLOWED_NAMESPACE_PATTERN import de.bixilon.minosoft.data.registries.identified.ResourceLocation.Companion.ALLOWED_PATH_PATTERN import java.util.* @@ -26,7 +24,7 @@ import java.util.* * @param namespace The namespace of the resource location * @param path The path of the resource location * - * @throws IllegalArgumentException If the namespace or path does not match the allowed pattern. See [ALLOWED_NAMESPACE_PATTERN] and [ALLOWED_PATH_PATTERN] + * @throws IllegalArgumentException If the namespace or path does not match the allowed pattern. and [ALLOWED_PATH_PATTERN] * * @see Resource location */ @@ -40,9 +38,7 @@ open class ResourceLocation( get() = this init { - if (StaticConfiguration.VALIDATE_RESOURCE_LOCATION && (namespace.isBlank() || !ALLOWED_NAMESPACE_PATTERN.matches(namespace))) { - throw IllegalArgumentException("Invalid namespace: $namespace") - } + ResourceLocationUtil.validateNamespace(namespace) // TODO: Figure out a way to implement this but have backwards compatibility with pre flattening versions // if (!ProtocolDefinition.ALLOWED_PATH_PATTERN.matches(path) && path != "") // throw IllegalArgumentException("Path '$path' is not allowed!") @@ -84,7 +80,6 @@ open class ResourceLocation( } companion object { - val ALLOWED_NAMESPACE_PATTERN = Regex("[a-z0-9_.\\-]+") val ALLOWED_PATH_PATTERN = Regex("(?!.*//)[a-z0-9_./\\-]+") /** diff --git a/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocationUtil.kt b/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocationUtil.kt new file mode 100644 index 000000000..b23d29c61 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/identified/ResourceLocationUtil.kt @@ -0,0 +1,41 @@ +/* + * Minosoft + * Copyright (C) 2020-2023 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.registries.identified + +import de.bixilon.minosoft.config.StaticConfiguration + +object ResourceLocationUtil { + + fun validateNamespace(namespace: String) { + if (!StaticConfiguration.VALIDATE_RESOURCE_LOCATION) { + return + } + if (namespace.isBlank()) { + throw IllegalArgumentException("Namespace is blank!") + } + for (code in namespace.codePoints()) { + if ( + code in 'a'.code..'z'.code || + code in '0'.code..'9'.code || + code == '_'.code || + code == '-'.code || + code == '.'.code + ) { + continue + } + + throw IllegalArgumentException("Namespace is illegal: $namespace") + } + } +} diff --git a/src/test/java/de/bixilon/minosoft/data/registries/ResourceLocationTest.kt b/src/test/java/de/bixilon/minosoft/data/registries/ResourceLocationTest.kt index e6a19f6d8..53fbe2e24 100644 --- a/src/test/java/de/bixilon/minosoft/data/registries/ResourceLocationTest.kt +++ b/src/test/java/de/bixilon/minosoft/data/registries/ResourceLocationTest.kt @@ -13,9 +13,12 @@ package de.bixilon.minosoft.data.registries +import de.bixilon.minosoft.data.registries.identified.Namespaces import de.bixilon.minosoft.data.registries.identified.ResourceLocation +import de.bixilon.minosoft.data.registries.identified.ResourceLocationUtil import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow import org.junit.jupiter.api.assertThrows import kotlin.test.assertNotEquals @@ -66,23 +69,31 @@ class ResourceLocationTest { assertThrows { ResourceLocation("in valid", "path") } } + @Test + fun integratedNamespaces() { + assertDoesNotThrow { ResourceLocationUtil.validateNamespace(Namespaces.MINECRAFT) } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace(Namespaces.MINOSOFT) } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace(Namespaces.DEFAULT) } + } + /** * @see [de.bixilon.minosoft.data.registries.ResourceLocation] */ @Test fun testAllowedNamespaces() { // Should Pass - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("minecraft"), true) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("min1234567890craft"), true) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("mine-craft"), true) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("mine_craft"), true) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("mine.craft"), true) + assertDoesNotThrow { ResourceLocationUtil.validateNamespace("minecraft") } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace("min1234567890craft") } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace("mine-craft") } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace("mine_craft") } + assertDoesNotThrow { ResourceLocationUtil.validateNamespace("mine.craft") } + // Should Fail - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("MineCraft"), false) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("mine craft"), false) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("minecraft!"), false) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("^minecraft"), false) - kotlin.test.assertEquals(ResourceLocation.ALLOWED_NAMESPACE_PATTERN.matches("mine/craft"), false) + assertThrows { ResourceLocationUtil.validateNamespace("MineCraft") } + assertThrows { ResourceLocationUtil.validateNamespace("mine craft") } + assertThrows { ResourceLocationUtil.validateNamespace("minecraft!") } + assertThrows { ResourceLocationUtil.validateNamespace("^minecraft") } + assertThrows { ResourceLocationUtil.validateNamespace("mine/craft") } } /**