Skip to content

Commit 75593b0

Browse files
committed
fix: fixed permissions check - now exclusively reling on lp perms
1 parent f13042b commit 75593b0

10 files changed

Lines changed: 190 additions & 78 deletions

File tree

build.gradle

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,13 @@ dependencies {
2626
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
2727
implementation 'com.google.code.gson:gson:2.12.1'
2828

29-
include(modImplementation('me.lucko:fabric-permissions-api:0.3.1') {
30-
exclude group: "net.fabricmc.fabric-api"
31-
})
32-
33-
34-
// Server only dependencies
29+
compileOnly 'net.luckperms:api:5.4'
3530

3631
// Warp commands api - HuskHomes (fabric v4.7 [1.20.1])
3732
compileOnly("curse.maven:huskhomes-849217:5468607")
3833

3934
// Arda regions
40-
modApi(files("build/libs/arda-regions-0.0.3.jar"))
35+
modApi(files("build/libs/arda-regions-1.0.0.jar"))
4136

4237
modRuntimeOnly("me.djtheredstoner:DevAuth-fabric:${devauth_version}")
4338
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ loom_version=1.11-SNAPSHOT
1212
fabric_version=0.92.3+1.20.1
1313

1414
# Mod Properties
15-
mod_version=1.2.4
15+
mod_version=1.2.5
1616
maven_group = space.ajcool
1717
archives_base_name = ArdaPaths
1818

src/main/java/space/ajcool/ardapaths/ArdaPaths.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package space.ajcool.ardapaths;
22

3-
import me.lucko.fabric.api.permissions.v0.Permissions;
43
import net.fabricmc.api.EnvType;
54
import net.fabricmc.api.ModInitializer;
5+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
66
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
77
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
88
import net.fabricmc.fabric.api.event.player.UseItemCallback;
99
import net.fabricmc.loader.api.FabricLoader;
10+
import net.minecraft.server.network.ServerPlayerEntity;
1011
import net.minecraft.util.ActionResult;
1112
import net.minecraft.util.TypedActionResult;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415
import space.ajcool.ardapaths.core.Client;
16+
import space.ajcool.ardapaths.core.PermissionHelper;
1517
import space.ajcool.ardapaths.core.data.config.ServerConfigManager;
1618
import space.ajcool.ardapaths.core.data.config.server.ServerConfig;
1719
import space.ajcool.ardapaths.core.networking.PacketRegistry;
20+
import space.ajcool.ardapaths.core.networking.packets.EmptyPacket;
1821
import space.ajcool.ardapaths.mc.blocks.ModBlocks;
1922
import space.ajcool.ardapaths.mc.blocks.entities.ModBlockEntities;
2023
import space.ajcool.ardapaths.mc.blocks.entities.PathMarkerBlockEntity;
@@ -27,6 +30,7 @@ public class ArdaPaths implements ModInitializer
2730
{
2831
public static final String MOD_ID = "ardapaths";
2932
public static final Logger LOGGER = LoggerFactory.getLogger("ardapaths");
33+
public static final String MOD_EDIT_PERMISSION = String.format("%s.edit", MOD_ID);
3034
public static ServerConfigManager CONFIG_MANAGER;
3135
public static ServerConfig CONFIG;
3236

@@ -48,7 +52,7 @@ public void onInitialize()
4852
{
4953
var blockEntity = world.getBlockEntity(hitResult.getBlockPos().offset(hitResult.getSide()));
5054

51-
if ((blockEntity instanceof PathMarkerBlockEntity || player.getStackInHand(hand).isOf(ModBlocks.PATH_MARKER.asItem())) && !Permissions.check(player, "ardapaths.edit", false))
55+
if ((blockEntity instanceof PathMarkerBlockEntity || player.getStackInHand(hand).isOf(ModBlocks.PATH_MARKER.asItem())) && !PermissionHelper.hasEditPermission(player))
5256
return ActionResult.FAIL;
5357

5458
return ActionResult.PASS;
@@ -58,18 +62,23 @@ public void onInitialize()
5862
{
5963
var itemsStack = player.getStackInHand(hand);
6064

61-
if (itemsStack.isOf(ModBlocks.PATH_MARKER.asItem()) && !Permissions.check(player, "ardapaths.edit", false))
65+
if (itemsStack.isOf(ModBlocks.PATH_MARKER.asItem()) && !PermissionHelper.hasEditPermission(player))
6266
return TypedActionResult.fail(itemsStack);
6367

6468
return TypedActionResult.pass(itemsStack);
6569
});
6670

6771
PlayerBlockBreakEvents.BEFORE.register((world, player, pos, state, blockEntity) ->
68-
!(blockEntity instanceof PathMarkerBlockEntity) || Permissions.check(player, "ardapaths.edit", false));
72+
{
73+
if (blockEntity instanceof PathMarkerBlockEntity && !PermissionHelper.hasEditPermission(player))
74+
return false;
75+
76+
return true;
77+
});
6978
}
7079

71-
public static boolean amITheServer()
72-
{
80+
public static boolean amITheServer() {
81+
7382
var serverEnv = FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER;
7483

7584
if (!serverEnv) return Client.isInSinglePlayer();

src/main/java/space/ajcool/ardapaths/ArdaPathsClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.particle.ParticleTypes;
1111
import net.minecraft.text.Text;
1212
import net.minecraft.util.Formatting;
13+
import space.ajcool.ardapaths.core.PermissionHelper;
1314
import space.ajcool.ardapaths.core.data.LastVisitedTrailNodeData;
1415
import space.ajcool.ardapaths.core.data.config.ClientConfigManager;
1516
import space.ajcool.ardapaths.core.data.config.client.ClientConfig;
@@ -52,6 +53,7 @@ public void onInitializeClient()
5253
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) ->
5354
{
5455
CONFIG_MANAGER.updatePathData();
56+
PermissionHelper.hasEditPermission(client.player);
5557
});
5658

5759
ClientTickEvents.START_WORLD_TICK.register(level ->
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package space.ajcool.ardapaths.core;
2+
3+
import net.luckperms.api.LuckPerms;
4+
import net.luckperms.api.LuckPermsProvider;
5+
import net.luckperms.api.cacheddata.CachedPermissionData;
6+
import net.luckperms.api.model.user.User;
7+
import net.luckperms.api.util.Tristate;
8+
import net.minecraft.entity.player.PlayerEntity;
9+
import net.minecraft.server.network.ServerPlayerEntity;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
import space.ajcool.ardapaths.ArdaPaths;
13+
import space.ajcool.ardapaths.core.networking.PacketRegistry;
14+
import space.ajcool.ardapaths.core.networking.packets.EmptyPacket;
15+
16+
public class PermissionHelper {
17+
18+
private static Boolean hasEditPermission = false;
19+
private static long lastPermissionCheckTime = 0;
20+
private static final long PERMISSION_CHECK_COOLDOWN_MS = 60_000; // 1 minute cooldown
21+
22+
public static boolean hasEditPermission(@Nullable PlayerEntity player) {
23+
24+
if (player == null) return false;
25+
26+
if (ArdaPaths.amITheServer()) return serverEditPermissionCheck(player);
27+
else return clientEditPermissionCheck();
28+
}
29+
30+
private static boolean clientEditPermissionCheck() {
31+
32+
ArdaPaths.LOGGER.info("Client check edit permission for player {}", hasEditPermission);
33+
34+
var currentTime = System.currentTimeMillis();
35+
var delta = currentTime - lastPermissionCheckTime;
36+
37+
if (hasEditPermission == null || delta > PERMISSION_CHECK_COOLDOWN_MS) {
38+
39+
ArdaPaths.LOGGER.info("Refreshing permissions");
40+
41+
lastPermissionCheckTime = currentTime;
42+
PacketRegistry.PERMISSION_CHECK.send(new EmptyPacket(), response -> {hasEditPermission = response.hasPermission();});
43+
44+
// Default to false until we get a response from the server
45+
return hasEditPermission != null ? hasEditPermission : false;
46+
}
47+
48+
return hasEditPermission;
49+
}
50+
51+
private static boolean serverEditPermissionCheck(@NotNull PlayerEntity player) {
52+
53+
if (player instanceof ServerPlayerEntity serverPlayer) {
54+
55+
LuckPerms luckpermsApi = LuckPermsProvider.get();
56+
User user = luckpermsApi.getPlayerAdapter(ServerPlayerEntity.class).getUser(serverPlayer);
57+
58+
CachedPermissionData permissionData = user.getCachedData().getPermissionData();
59+
Tristate checkResult = permissionData.checkPermission(ArdaPaths.MOD_EDIT_PERMISSION);
60+
61+
boolean result = checkResult.asBoolean();
62+
ArdaPaths.LOGGER.info("Server check edit permission for player {} - {}", player.getName(), result);
63+
64+
return result;
65+
}
66+
67+
return false;
68+
}
69+
}

src/main/java/space/ajcool/ardapaths/core/networking/PacketRegistry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class PacketRegistry
2222
public static final ChapterStartUpdateHandler CHAPTER_START_UPDATE = register(new ChapterStartUpdateHandler());
2323
public static final ChapterStartRemoveHandler CHAPTER_START_REMOVE = register(new ChapterStartRemoveHandler());
2424
public static final ChapterPlayerTeleportHandler CHAPTER_PLAYER_TELEPORT = register(new ChapterPlayerTeleportHandler());
25+
public static final ArdaPathsPermissionCheckHandler PERMISSION_CHECK = register(new ArdaPathsPermissionCheckHandler());
2526

2627
/**
2728
* Register a client-to-server packet handler.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package space.ajcool.ardapaths.core.networking.handlers.server;
2+
3+
import net.fabricmc.fabric.api.networking.v1.PacketSender;
4+
import net.minecraft.server.MinecraftServer;
5+
import net.minecraft.server.network.ServerPlayNetworkHandler;
6+
import net.minecraft.server.network.ServerPlayerEntity;
7+
import space.ajcool.ardapaths.core.PermissionHelper;
8+
import space.ajcool.ardapaths.core.consumers.networking.RespondablePacketHandler;
9+
import space.ajcool.ardapaths.core.networking.packets.EmptyPacket;
10+
import space.ajcool.ardapaths.core.networking.packets.client.ArdaPathsPermissionCheckResponsePacket;
11+
12+
public class ArdaPathsPermissionCheckHandler extends RespondablePacketHandler<EmptyPacket, ArdaPathsPermissionCheckResponsePacket> {
13+
14+
private static final String REQUEST_CHANNEL = "ardapaths_permission_check_request";
15+
private static final String RESPONSE_CHANNEL = "ardapaths_permission_check_response";
16+
17+
public ArdaPathsPermissionCheckHandler() {
18+
super(REQUEST_CHANNEL, EmptyPacket::read, RESPONSE_CHANNEL, ArdaPathsPermissionCheckResponsePacket::read);
19+
}
20+
21+
@Override
22+
public ArdaPathsPermissionCheckResponsePacket handle(MinecraftServer server, ServerPlayerEntity player, ServerPlayNetworkHandler handler, EmptyPacket packet, PacketSender sender) {
23+
24+
if (player == null) return new ArdaPathsPermissionCheckResponsePacket(false);
25+
26+
return new ArdaPathsPermissionCheckResponsePacket(PermissionHelper.hasEditPermission(player));
27+
}
28+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package space.ajcool.ardapaths.core.networking.packets.client;
2+
3+
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
4+
import net.minecraft.network.PacketByteBuf;
5+
import space.ajcool.ardapaths.core.consumers.networking.IPacket;
6+
7+
public record ArdaPathsPermissionCheckResponsePacket(boolean hasPermission) implements IPacket {
8+
9+
@Override
10+
public PacketByteBuf build() {
11+
PacketByteBuf buf = PacketByteBufs.create();
12+
buf.writeBoolean(hasPermission);
13+
return buf;
14+
}
15+
16+
public static ArdaPathsPermissionCheckResponsePacket read(PacketByteBuf buf)
17+
{
18+
final boolean hasPerm = buf.readBoolean();
19+
return new ArdaPathsPermissionCheckResponsePacket(hasPerm);
20+
}
21+
}

src/main/java/space/ajcool/ardapaths/mc/blocks/PathMarkerBlock.java

Lines changed: 51 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package space.ajcool.ardapaths.mc.blocks;
22

3-
import me.lucko.fabric.api.permissions.v0.Permissions;
43
import net.minecraft.block.*;
54
import net.minecraft.block.entity.BlockEntity;
65
import net.minecraft.block.entity.BlockEntityTicker;
76
import net.minecraft.block.entity.BlockEntityType;
7+
import net.minecraft.client.MinecraftClient;
88
import net.minecraft.entity.player.PlayerEntity;
99
import net.minecraft.text.MutableText;
1010
import net.minecraft.text.Text;
@@ -22,6 +22,7 @@
2222
import space.ajcool.ardapaths.ArdaPathsClient;
2323
import space.ajcool.ardapaths.core.Client;
2424
import space.ajcool.ardapaths.core.networking.PacketRegistry;
25+
import space.ajcool.ardapaths.core.networking.packets.EmptyPacket;
2526
import space.ajcool.ardapaths.core.networking.packets.server.PathMarkerUpdatePacket;
2627
import space.ajcool.ardapaths.mc.blocks.entities.ModBlockEntities;
2728
import space.ajcool.ardapaths.mc.blocks.entities.PathMarkerBlockEntity;
@@ -40,78 +41,67 @@ public PathMarkerBlock(AbstractBlock.Settings properties)
4041

4142
public ActionResult onUse(BlockState blockState, World level, BlockPos blockPos, PlayerEntity player, Hand interactionHand, BlockHitResult blockHitResult)
4243
{
43-
if (!Permissions.check(player, "ardapaths.edit", 4))
44-
{
45-
return ActionResult.CONSUME;
46-
}
47-
4844
BlockEntity selectedBlockEntity = level.getBlockEntity(blockPos);
4945

50-
if (!player.isHolding(ModItems.PATH_MARKER) || !(selectedBlockEntity instanceof PathMarkerBlockEntity pathMarkerBlockEntity))
51-
{
52-
return ActionResult.PASS;
53-
}
54-
if (!level.isClient())
55-
{
56-
return ActionResult.CONSUME;
57-
}
58-
59-
if (Client.isCtrlDown())
60-
{
61-
Screens.openEditorScreen(pathMarkerBlockEntity);
62-
return ActionResult.CONSUME;
63-
}
64-
65-
if (selectedBlockPosition == null)
66-
{
67-
if (selectedBlockEntity instanceof PathMarkerBlockEntity)
68-
{
46+
if (selectedBlockEntity == null) return ActionResult.PASS;
47+
if (!player.isHolding(ModItems.PATH_MARKER) || !(selectedBlockEntity instanceof PathMarkerBlockEntity pathMarkerBlockEntity)) return ActionResult.PASS;
48+
if (!level.isClient()) return ActionResult.CONSUME;
49+
50+
PacketRegistry.PERMISSION_CHECK.send(new EmptyPacket(),response -> {
51+
if (response.hasPermission()) this.validateOnUse(level, blockPos, pathMarkerBlockEntity, player);
52+
});
53+
54+
return ActionResult.CONSUME;
55+
}
56+
57+
public void validateOnUse(World level, BlockPos blockPos, PathMarkerBlockEntity pathMarkerBlockEntity, PlayerEntity player){
58+
MinecraftClient.getInstance().execute(() -> {
59+
if (Client.isCtrlDown()) {
60+
Screens.openEditorScreen(pathMarkerBlockEntity);
61+
return;
62+
}
63+
64+
if (selectedBlockPosition == null) {
6965
selectedBlockPosition = blockPos;
7066

7167
var message = Text.empty()
7268
.append(Text.literal("ArdaPaths: ").formatted(Formatting.DARK_AQUA))
7369
.append(Text.literal("Selected origin block.").formatted(Formatting.BLUE));
7470

7571
player.sendMessage(message);
76-
}
77-
}
78-
else
79-
{
80-
BlockEntity blockEntity = level.getBlockEntity(selectedBlockPosition);
81-
82-
if (blockEntity instanceof PathMarkerBlockEntity pathMarker)
83-
{
84-
MutableText message;
85-
86-
if (selectedBlockPosition.equals(blockPos))
87-
{
88-
message = Text.empty()
89-
.append(Text.literal("ArdaPaths: ").formatted(Formatting.DARK_AQUA))
90-
.append(Text.literal("Target block removed.").formatted(Formatting.RED));
91-
92-
PathMarkerBlockEntity.ChapterNbtData data = pathMarker.getChapterData(ArdaPathsClient.CONFIG.getSelectedPathId(), ArdaPathsClient.CONFIG.getCurrentChapterId());
93-
data.removeTarget();
94-
}
95-
else
96-
{
97-
message = Text.empty()
98-
.append(Text.literal("ArdaPaths: ").formatted(Formatting.DARK_AQUA))
99-
.append(Text.literal("Target block set.").formatted(Formatting.GREEN));
100-
101-
PathMarkerBlockEntity.ChapterNbtData data = pathMarker.getChapterData(ArdaPathsClient.CONFIG.getSelectedPathId(), ArdaPathsClient.CONFIG.getCurrentChapterId());
102-
data.setTarget(blockPos.subtract(selectedBlockPosition));
103-
}
10472

105-
PathMarkerUpdatePacket packet = new PathMarkerUpdatePacket(pathMarker.getPos(), pathMarker.createNbt());
106-
PacketRegistry.PATH_MARKER_UPDATE.send(packet);
107-
player.sendMessage(message);
108-
ArdaPaths.LOGGER.info("Sending Update Packet");
109-
}
73+
} else {
11074

111-
selectedBlockPosition = null;
112-
}
75+
BlockEntity blockEntity = level.getBlockEntity(selectedBlockPosition);
11376

114-
return ActionResult.CONSUME;
77+
if (blockEntity instanceof PathMarkerBlockEntity pathMarker) {
78+
MutableText message;
79+
80+
if (selectedBlockPosition.equals(blockPos)) {
81+
message = Text.empty()
82+
.append(Text.literal("ArdaPaths: ").formatted(Formatting.DARK_AQUA))
83+
.append(Text.literal("Target block removed.").formatted(Formatting.RED));
84+
85+
PathMarkerBlockEntity.ChapterNbtData data = pathMarker.getChapterData(ArdaPathsClient.CONFIG.getSelectedPathId(), ArdaPathsClient.CONFIG.getCurrentChapterId());
86+
data.removeTarget();
87+
} else {
88+
message = Text.empty()
89+
.append(Text.literal("ArdaPaths: ").formatted(Formatting.DARK_AQUA))
90+
.append(Text.literal("Target block set.").formatted(Formatting.GREEN));
91+
92+
PathMarkerBlockEntity.ChapterNbtData data = pathMarker.getChapterData(ArdaPathsClient.CONFIG.getSelectedPathId(), ArdaPathsClient.CONFIG.getCurrentChapterId());
93+
data.setTarget(blockPos.subtract(selectedBlockPosition));
94+
}
95+
96+
PathMarkerUpdatePacket packet = new PathMarkerUpdatePacket(pathMarker.getPos(), pathMarker.createNbt());
97+
PacketRegistry.PATH_MARKER_UPDATE.send(packet);
98+
player.sendMessage(message);
99+
ArdaPaths.LOGGER.info("Sending Update Packet");
100+
}
101+
102+
selectedBlockPosition = null;
103+
}
104+
});
115105
}
116106

117107
public boolean isTransparent(BlockState blockState, BlockView blockGetter, BlockPos blockPos)

0 commit comments

Comments
 (0)