1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-02 22:53:15 +00:00

Use permission APIs for the /computercraft command

- Add a generic PermissionRegistry interface. This behaves similarly to
   our ShaderMod interface, searching all providers until it finds a
   compatible one.

   We could just make this part of the platform code instead, but this
   allows us to support multiple systems on Fabric, where things are
   less standardised.

   This interface behaves like a registry, rather than a straight
   `getPermission(node, player)` method, as Forge requires us to list
   our nodes up-front.

 - Add Forge (using the built-in system) and Fabric (using
   fabric-permissions-api) implementations of the above interface.

 - Register permission nodes for our commands, and use those
   instead. This does mean that the permissions check for the root
   /computercraft command now requires enumerating all child
   commands (and so potential does 7 permission lookups), but hopefully
   this isn't too bad in practice.

 - Remove UserLevel.OWNER - we never used this anywhere, and I can't
   imagine we'll want to in the future.
This commit is contained in:
Jonathan Coates
2023-08-27 12:15:55 +01:00
parent 5f8b1dd67f
commit b3738a7a63
11 changed files with 249 additions and 69 deletions

View File

@@ -0,0 +1,40 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.shared.integration;
import com.google.auto.service.AutoService;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.shared.command.UserLevel;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.commands.CommandSourceStack;
import java.util.Optional;
import java.util.function.Predicate;
/**
* An implementation of {@link PermissionRegistry} using Fabric's unofficial {@linkplain Permissions permissions api}.
*/
public final class FabricPermissionRegistry extends PermissionRegistry {
private FabricPermissionRegistry() {
}
@Override
public Predicate<CommandSourceStack> registerCommand(String command, UserLevel fallback) {
checkNotFrozen();
var name = ComputerCraftAPI.MOD_ID + ".command." + command;
return source -> Permissions.getPermissionValue(source, name).orElseGet(() -> fallback.test(source));
}
@AutoService(PermissionRegistry.Provider.class)
public static final class Provider implements PermissionRegistry.Provider {
@Override
public Optional<PermissionRegistry> get() {
return FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0")
? Optional.of(new FabricPermissionRegistry())
: Optional.empty();
}
}
}