diff --git a/common_server/build.gradle.kts b/common_server/build.gradle.kts index bd102f2..9c17243 100644 --- a/common_server/build.gradle.kts +++ b/common_server/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { mappings(loom.officialMojangMappings()) implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0-RC") + compileOnly("net.luckperms:api:5.4") } tasks { diff --git a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/ChatEmotesServerModBase.kt b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/ChatEmotesServerModBase.kt index db17267..6536fb6 100644 --- a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/ChatEmotesServerModBase.kt +++ b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/ChatEmotesServerModBase.kt @@ -3,6 +3,7 @@ package io.github.colintimbarndt.chat_emotes.common import io.github.colintimbarndt.chat_emotes.common.config.ChatEmotesConfig import io.github.colintimbarndt.chat_emotes.common.data.EmoteDataLoaderBase import io.github.colintimbarndt.chat_emotes.common.permissions.PermissionsAdapter +import io.github.colintimbarndt.chat_emotes.common.permissions.SafePermissionsAdapter import io.github.colintimbarndt.chat_emotes.common.permissions.VanillaPermissionsAdapter import kotlinx.serialization.SerializationException import java.io.FileInputStream @@ -16,7 +17,9 @@ abstract class ChatEmotesServerModBase { abstract val emoteDataLoader: EmoteDataLoaderBase abstract val registries: Registries abstract val emoteDecorator: EmoteDecoratorBase - var permissionsAdapter: PermissionsAdapter = VanillaPermissionsAdapter + var permissionsAdapter: PermissionsAdapter = SafePermissionsAdapter + + protected open fun findPermissionsAdapter(): PermissionsAdapter = VanillaPermissionsAdapter fun reloadConfig(): Boolean { val file = configPath.resolve("config.json").toFile() diff --git a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/LuckpermsPermissionsAdapter.kt b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/LuckpermsPermissionsAdapter.kt new file mode 100644 index 0000000..2321f56 --- /dev/null +++ b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/LuckpermsPermissionsAdapter.kt @@ -0,0 +1,29 @@ +package io.github.colintimbarndt.chat_emotes.common.permissions + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import net.luckperms.api.LuckPermsProvider +import net.minecraft.commands.CommandSourceStack +import net.minecraft.server.level.ServerPlayer + +/** + * See [luckperms.net](https://luckperms.net/) + */ +@Serializable +@SerialName("luckperms") +object LuckpermsPermissionsAdapter : PermissionsAdapter { + private val api = LuckPermsProvider.get() + + override fun CommandSourceStack.hasPermission(name: String): Boolean { + val player = player + ?: return true // console / command block + return player.hasPermission(name) + } + + override fun ServerPlayer.hasPermission(name: String): Boolean { + val user = api.userManager.getUser(uuid) + ?: return false // User not found + val perms = user.cachedData.permissionData + return perms.checkPermission(name).asBoolean() + } +} \ No newline at end of file diff --git a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/SafePermissionsAdapter.kt b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/SafePermissionsAdapter.kt new file mode 100644 index 0000000..fa21aeb --- /dev/null +++ b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/SafePermissionsAdapter.kt @@ -0,0 +1,21 @@ +package io.github.colintimbarndt.chat_emotes.common.permissions + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import net.minecraft.commands.CommandSourceStack +import net.minecraft.server.level.ServerPlayer + +/** + * Only emotes are permitted, every other permission is denied + */ +@Serializable +@SerialName("safe") +object SafePermissionsAdapter : PermissionsAdapter { + override fun CommandSourceStack.hasPermission(name: String) = isEmotesPermission(name) + + override fun ServerPlayer.hasPermission(name: String) = isEmotesPermission(name) + + private fun isEmotesPermission(name: String): Boolean = + name.startsWith(EMOTES_PERMISSION) + && (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.') +} \ No newline at end of file diff --git a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/VanillaPermissionsAdapter.kt b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/VanillaPermissionsAdapter.kt index 6e6b51f..4e37d5f 100644 --- a/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/VanillaPermissionsAdapter.kt +++ b/common_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/common/permissions/VanillaPermissionsAdapter.kt @@ -11,14 +11,12 @@ object VanillaPermissionsAdapter : PermissionsAdapter { override fun CommandSourceStack.hasPermission(name: String) = when (name) { RELOAD_COMMAND_PERMISSION -> hasPermission(2) COMMAND_PERMISSION -> hasPermission(2) - else -> name.startsWith(EMOTES_PERMISSION) - && (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.') + else -> SafePermissionsAdapter.run { hasPermission(name) } } override fun ServerPlayer.hasPermission(name: String) = when (name) { RELOAD_COMMAND_PERMISSION -> hasPermissions(2) COMMAND_PERMISSION -> hasPermissions(2) - else -> name.startsWith(EMOTES_PERMISSION) - && (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.') + else -> SafePermissionsAdapter.run { hasPermission(name) } } } \ No newline at end of file diff --git a/fabric_mod_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/ChatEmotesServerMod.kt b/fabric_mod_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/ChatEmotesServerMod.kt index 14e9a07..be00c96 100644 --- a/fabric_mod_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/ChatEmotesServerMod.kt +++ b/fabric_mod_server/src/main/kotlin/io/github/colintimbarndt/chat_emotes/ChatEmotesServerMod.kt @@ -7,6 +7,8 @@ import io.github.colintimbarndt.chat_emotes.common.LOGGER import io.github.colintimbarndt.chat_emotes.common.MOD_ID import io.github.colintimbarndt.chat_emotes.common.Registries import io.github.colintimbarndt.chat_emotes.common.config.ChatEmotesConfig +import io.github.colintimbarndt.chat_emotes.common.permissions.LuckpermsPermissionsAdapter +import io.github.colintimbarndt.chat_emotes.common.permissions.PermissionsAdapter import io.github.colintimbarndt.chat_emotes.data.EmoteDataLoader import net.fabricmc.api.DedicatedServerModInitializer import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback @@ -29,6 +31,7 @@ object ChatEmotesServerMod : ChatEmotesServerModBase(), DedicatedServerModInitia lateinit var modMetadata: ModMetadata private set override fun onInitializeServer() { + permissionsAdapter = findPermissionsAdapter() registries = Registries() val loader = FabricLoader.getInstance() @@ -56,4 +59,17 @@ object ChatEmotesServerMod : ChatEmotesServerModBase(), DedicatedServerModInitia ChatEmotesCommand.register(dispatcher) } } + + override fun findPermissionsAdapter(): PermissionsAdapter { + val loader = FabricLoader.getInstance() + if (loader.isModLoaded("luckperms")) { + LOGGER.info("Connecting to LuckPerms") + runCatching { + return LuckpermsPermissionsAdapter + }.onFailure { + LOGGER.error("Unable to connect to LuckPerms", it) + } + } + return super.findPermissionsAdapter() + } } \ No newline at end of file diff --git a/fabric_mod_server/src/main/resources/fabric.mod.json b/fabric_mod_server/src/main/resources/fabric.mod.json index bda94ed..9eaabda 100644 --- a/fabric_mod_server/src/main/resources/fabric.mod.json +++ b/fabric_mod_server/src/main/resources/fabric.mod.json @@ -37,5 +37,7 @@ "java": ">=17", "fabric-language-kotlin": ">=1.8.2+kotlin.1.7.10" }, - "suggests": {} + "suggests": { + "luckperms": ">=5.4" + } }