Skip to content

Commit caa16ca

Browse files
committed
fix permission
1 parent a8a82c6 commit caa16ca

10 files changed

Lines changed: 134 additions & 7 deletions

src/main/java/com/hfstudio/guidenh/client/command/GuideNhClientBridgeController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,23 @@ public CompletableFuture<String> requestRegionExport(int x, int y, int z, int si
148148
int requestId = nextRegionExportRequestId.getAndIncrement();
149149
CompletableFuture<String> future = new CompletableFuture<>();
150150
pendingRegionExports.put(requestId, future);
151+
Minecraft minecraft = Minecraft.getMinecraft();
152+
EntityPlayer player = minecraft.thePlayer;
153+
int dimensionId = player != null && player.worldObj != null && player.worldObj.provider != null
154+
? player.worldObj.provider.dimensionId
155+
: 0;
151156
GuideNhNetwork.channel()
152157
.sendToServer(
153-
new GuideNhRegionExportRequestMessage(requestId, x, y, z, sizeX, sizeY, sizeZ, includeEntities));
158+
new GuideNhRegionExportRequestMessage(
159+
requestId,
160+
dimensionId,
161+
x,
162+
y,
163+
z,
164+
sizeX,
165+
sizeY,
166+
sizeZ,
167+
includeEntities));
154168
return future;
155169
}
156170

src/main/java/com/hfstudio/guidenh/guide/internal/GuideCommand.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.minecraft.util.ResourceLocation;
1212

1313
import com.hfstudio.guidenh.guide.Guide;
14+
import com.hfstudio.guidenh.guide.internal.structure.GuideNhServerStructureAccess;
1415

1516
public class GuideCommand extends CommandBase {
1617

@@ -59,6 +60,12 @@ public void processCommand(ICommandSender sender, String[] args) throws CommandE
5960
.openGuide(player, guideId, null);
6061
}
6162
case "reload" -> {
63+
if (!sender.canCommandSenderUseCommand(
64+
GuideNhServerStructureAccess.STRUCTURE_PERMISSION_LEVEL,
65+
getCommandName())) {
66+
send(sender, GuidebookText.CommandStructurePermissionDenied);
67+
return;
68+
}
6269
boolean ok = GuideMEProxy.instance()
6370
.reloadResources();
6471
if (ok) {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.hfstudio.guidenh.guide.internal.structure;
2+
3+
import net.minecraft.entity.player.EntityPlayerMP;
4+
import net.minecraft.server.MinecraftServer;
5+
6+
import com.hfstudio.guidenh.config.ModConfig;
7+
8+
public class GuideNhServerStructureAccess {
9+
10+
public static final String STRUCTURE_COMMAND_NAME = "guidenh";
11+
public static final int STRUCTURE_PERMISSION_LEVEL = 3;
12+
13+
private GuideNhServerStructureAccess() {}
14+
15+
public static boolean canUseSceneExport(EntityPlayerMP player) {
16+
return isSceneExportEnabled() && (isSinglePlayerServer() || hasStructurePermission(player));
17+
}
18+
19+
public static boolean hasStructurePermission(EntityPlayerMP player) {
20+
return player != null && player.canCommandSenderUseCommand(STRUCTURE_PERMISSION_LEVEL, STRUCTURE_COMMAND_NAME);
21+
}
22+
23+
public static boolean isSceneExportEnabled() {
24+
return ModConfig.ui.sceneExportEnabled;
25+
}
26+
27+
public static boolean isSameDimension(EntityPlayerMP player, int dimensionId) {
28+
return player != null && player.worldObj != null
29+
&& player.worldObj.provider != null
30+
&& player.worldObj.provider.dimensionId == dimensionId;
31+
}
32+
33+
private static boolean isSinglePlayerServer() {
34+
MinecraftServer server = MinecraftServer.getServer();
35+
return server != null && server.isSinglePlayer();
36+
}
37+
}

src/main/java/com/hfstudio/guidenh/integration/ae2/network/GuideNhAe2BaseTileNetworkBatchServerHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.hfstudio.guidenh.integration.ae2.network;
22

3+
import net.minecraft.entity.player.EntityPlayerMP;
34
import net.minecraft.server.MinecraftServer;
45
import net.minecraft.tileentity.TileEntity;
56
import net.minecraft.world.WorldServer;
67

8+
import com.hfstudio.guidenh.guide.internal.structure.GuideNhServerStructureAccess;
79
import com.hfstudio.guidenh.integration.Mods;
810
import com.hfstudio.guidenh.integration.ae2.Ae2BaseTileNetworkStreamPreview;
911

@@ -17,6 +19,7 @@ public class GuideNhAe2BaseTileNetworkBatchServerHandler
1719

1820
@Override
1921
public IMessage onMessage(GuideNhAe2BaseTileNetworkBatchRequestMessage message, MessageContext ctx) {
22+
EntityPlayerMP player = ctx.getServerHandler().playerEntity;
2023
long corr = message.getCorrId();
2124
int dim = message.getDim();
2225
int[] xyz = message.getXyz();
@@ -25,7 +28,11 @@ public IMessage onMessage(GuideNhAe2BaseTileNetworkBatchRequestMessage message,
2528
n = Math.max(0, xyz.length / 3);
2629
}
2730

28-
if (!Mods.AE2.isModLoaded() || n <= 0 || n > GuideNhAe2BaseTileNetworkBatchRequestMessage.MAX_POSITIONS) {
31+
if (player == null || !Mods.AE2.isModLoaded()
32+
|| !GuideNhServerStructureAccess.canUseSceneExport(player)
33+
|| !GuideNhServerStructureAccess.isSameDimension(player, dim)
34+
|| n <= 0
35+
|| n > GuideNhAe2BaseTileNetworkBatchRequestMessage.MAX_POSITIONS) {
2936
return new GuideNhAe2BaseTileNetworkBatchReplyMessage(corr, new byte[0][]);
3037
}
3138

src/main/java/com/hfstudio/guidenh/integration/ae2/network/GuideNhAe2CableBatchServerHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import java.io.IOException;
44

5+
import net.minecraft.entity.player.EntityPlayerMP;
56
import net.minecraft.server.MinecraftServer;
67
import net.minecraft.tileentity.TileEntity;
78
import net.minecraft.world.WorldServer;
89
import net.minecraftforge.common.util.ForgeDirection;
910

11+
import com.hfstudio.guidenh.guide.internal.structure.GuideNhServerStructureAccess;
1012
import com.hfstudio.guidenh.integration.Mods;
1113
import com.hfstudio.guidenh.integration.ae2.Ae2CableBusPartStreamCodec;
1214
import com.hfstudio.guidenh.integration.ae2.Ae2CableBusSideStreams;
@@ -25,6 +27,7 @@ public class GuideNhAe2CableBatchServerHandler
2527

2628
@Override
2729
public IMessage onMessage(GuideNhAe2CableBatchRequestMessage message, MessageContext ctx) {
30+
EntityPlayerMP player = ctx.getServerHandler().playerEntity;
2831
long corr = message.getCorrId();
2932
int dim = message.getDim();
3033
int[] xyz = message.getXyz();
@@ -33,7 +36,11 @@ public IMessage onMessage(GuideNhAe2CableBatchRequestMessage message, MessageCon
3336
n = Math.max(0, xyz.length / 3);
3437
}
3538

36-
if (!Mods.AE2.isModLoaded() || n <= 0 || n > GuideNhAe2CableBatchRequestMessage.MAX_POSITIONS) {
39+
if (player == null || !Mods.AE2.isModLoaded()
40+
|| !GuideNhServerStructureAccess.canUseSceneExport(player)
41+
|| !GuideNhServerStructureAccess.isSameDimension(player, dim)
42+
|| n <= 0
43+
|| n > GuideNhAe2CableBatchRequestMessage.MAX_POSITIONS) {
3744
return new GuideNhAe2CableBatchReplyMessage(corr, new byte[0], new byte[0], new int[0], new byte[0][]);
3845
}
3946

src/main/java/com/hfstudio/guidenh/network/GuideNhCustomPayloadLimits.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ public class GuideNhCustomPayloadLimits {
44

55
public static final int MAX_PAYLOAD_BYTES = 28 * 1024;
66
public static final int MAX_STRUCTURE_BYTES_PER_PACKET = 27 * 1024;
7+
public static final int MAX_STRUCTURE_TRANSFER_BYTES = 8 * 1024 * 1024;
8+
public static final long STRUCTURE_TRANSFER_TTL_MILLIS = 30_000L;
79

810
private GuideNhCustomPayloadLimits() {}
911
}

src/main/java/com/hfstudio/guidenh/network/GuideNhRegionExportRequestMessage.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
public class GuideNhRegionExportRequestMessage implements IMessage {
77

88
private int requestId;
9+
private int dimensionId;
910
private int x;
1011
private int y;
1112
private int z;
@@ -16,9 +17,10 @@ public class GuideNhRegionExportRequestMessage implements IMessage {
1617

1718
public GuideNhRegionExportRequestMessage() {}
1819

19-
public GuideNhRegionExportRequestMessage(int requestId, int x, int y, int z, int sizeX, int sizeY, int sizeZ,
20-
boolean includeEntities) {
20+
public GuideNhRegionExportRequestMessage(int requestId, int dimensionId, int x, int y, int z, int sizeX, int sizeY,
21+
int sizeZ, boolean includeEntities) {
2122
this.requestId = requestId;
23+
this.dimensionId = dimensionId;
2224
this.x = x;
2325
this.y = y;
2426
this.z = z;
@@ -32,6 +34,10 @@ public int getRequestId() {
3234
return requestId;
3335
}
3436

37+
public int getDimensionId() {
38+
return dimensionId;
39+
}
40+
3541
public int getX() {
3642
return x;
3743
}
@@ -63,6 +69,7 @@ public boolean isIncludeEntities() {
6369
@Override
6470
public void fromBytes(ByteBuf buf) {
6571
requestId = buf.readInt();
72+
dimensionId = buf.readInt();
6673
x = buf.readInt();
6774
y = buf.readInt();
6875
z = buf.readInt();
@@ -75,6 +82,7 @@ public void fromBytes(ByteBuf buf) {
7582
@Override
7683
public void toBytes(ByteBuf buf) {
7784
buf.writeInt(requestId);
85+
buf.writeInt(dimensionId);
7886
buf.writeInt(x);
7987
buf.writeInt(y);
8088
buf.writeInt(z);

src/main/java/com/hfstudio/guidenh/network/GuideNhRegionExportServerHandler.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.minecraft.util.AxisAlignedBB;
99

1010
import com.hfstudio.guidenh.guide.internal.item.RegionWandItem;
11+
import com.hfstudio.guidenh.guide.internal.structure.GuideNhServerStructureAccess;
1112
import com.hfstudio.guidenh.guide.internal.structure.GuideStructureVolume;
1213

1314
import cpw.mods.fml.common.network.simpleimpl.IMessage;
@@ -22,6 +23,13 @@ public IMessage onMessage(GuideNhRegionExportRequestMessage message, MessageCont
2223
if (player == null) {
2324
return null;
2425
}
26+
if (!GuideNhServerStructureAccess.canUseSceneExport(player)) {
27+
GuideNhNetwork.channel()
28+
.sendTo(
29+
GuideNhRegionExportReplyMessage.error(message.getRequestId(), "Scene export is not allowed"),
30+
player);
31+
return null;
32+
}
2533
try {
2634
String structureText = exportRegion(player, message);
2735
if (structureText == null) {
@@ -50,6 +58,9 @@ private String exportRegion(EntityPlayerMP player, GuideNhRegionExportRequestMes
5058
|| GuideStructureVolume.exceedsLimit(sizeX, sizeY, sizeZ, RegionWandItem.MAX_EXPORT_BLOCKS)) {
5159
return null;
5260
}
61+
if (!GuideNhServerStructureAccess.isSameDimension(player, message.getDimensionId())) {
62+
return null;
63+
}
5364
int x = message.getX();
5465
int y = message.getY();
5566
int z = message.getZ();

src/main/java/com/hfstudio/guidenh/network/GuideNhStructureChunkAssembler.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
public class GuideNhStructureChunkAssembler {
99

1010
private final byte[][] chunks;
11+
private final long expiresAtMillis;
12+
private boolean discarded;
1113
private int received;
1214
private int totalBytes;
1315

@@ -16,10 +18,14 @@ public GuideNhStructureChunkAssembler(int chunkCount) {
1618
throw new IllegalArgumentException("Invalid structure chunk count: " + chunkCount);
1719
}
1820
this.chunks = new byte[chunkCount][];
21+
this.expiresAtMillis = System.currentTimeMillis() + GuideNhCustomPayloadLimits.STRUCTURE_TRANSFER_TTL_MILLIS;
1922
}
2023

2124
@Nullable
2225
public synchronized String accept(GuideNhStructureRequestMessage message) {
26+
if (isExpired()) {
27+
return null;
28+
}
2329
int index = message.getChunkIndex();
2430
if (message.getChunkCount() != chunks.length || index < 0 || index >= chunks.length) {
2531
return null;
@@ -32,6 +38,10 @@ public synchronized String accept(GuideNhStructureRequestMessage message) {
3238
chunks[index] = bytes;
3339
received++;
3440
totalBytes += bytes.length;
41+
if (totalBytes > GuideNhCustomPayloadLimits.MAX_STRUCTURE_TRANSFER_BYTES) {
42+
discarded = true;
43+
return null;
44+
}
3545
}
3646
if (received != chunks.length) {
3747
return null;
@@ -46,4 +56,8 @@ public synchronized String accept(GuideNhStructureRequestMessage message) {
4656
}
4757
return out.toString(StandardCharsets.UTF_8);
4858
}
59+
60+
public boolean isExpired() {
61+
return discarded || System.currentTimeMillis() > expiresAtMillis;
62+
}
4963
}

src/main/java/com/hfstudio/guidenh/network/GuideNhStructureRequestHandler.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.minecraft.util.ChatComponentTranslation;
88

99
import com.hfstudio.guidenh.guide.internal.GuidebookText;
10+
import com.hfstudio.guidenh.guide.internal.structure.GuideNhServerStructureAccess;
1011
import com.hfstudio.guidenh.guide.internal.structure.GuideNhStructureRuntime;
1112
import com.hfstudio.guidenh.guide.internal.structure.GuideStructureMemoryStore;
1213
import com.hfstudio.guidenh.guide.internal.structure.GuideStructureWorldPlacementTarget;
@@ -25,18 +26,26 @@ public IMessage onMessage(GuideNhStructureRequestMessage message, MessageContext
2526
if (player == null) {
2627
return null;
2728
}
29+
pruneExpiredTransfers();
2830
var playerId = player.getUniqueID();
2931
var sessionStore = GuideNhStructureRuntime.getServerSessionStore();
3032

3133
try {
3234
byte action = message.getAction();
3335
String structureText = message.getStructureText();
3436
if (message.isChunkedStructureTransfer()) {
37+
if (!GuideNhServerStructureAccess.canUseSceneExport(player)) {
38+
send(player, GuidebookText.CommandStructurePermissionDenied);
39+
return null;
40+
}
3541
TransferKey key = new TransferKey(playerId, message.getAction(), message.getTransferId());
3642
GuideNhStructureChunkAssembler assembler = CHUNK_TRANSFERS
3743
.computeIfAbsent(key, ignored -> new GuideNhStructureChunkAssembler(message.getChunkCount()));
3844
structureText = assembler.accept(message);
3945
if (structureText == null) {
46+
if (assembler.isExpired()) {
47+
CHUNK_TRANSFERS.remove(key, assembler);
48+
}
4049
return null;
4150
}
4251
CHUNK_TRANSFERS.remove(key);
@@ -45,10 +54,14 @@ public IMessage onMessage(GuideNhStructureRequestMessage message, MessageContext
4554

4655
switch (action) {
4756
case GuideNhStructureRequestMessage.ACTION_CACHE:
57+
if (!GuideNhServerStructureAccess.canUseSceneExport(player)) {
58+
send(player, GuidebookText.CommandStructurePermissionDenied);
59+
break;
60+
}
4861
sessionStore.remember(playerId, "client-cache", structureText);
4962
break;
5063
case GuideNhStructureRequestMessage.ACTION_IMPORT_AND_PLACE:
51-
if (!player.canCommandSenderUseCommand(3, "guidenh")) {
64+
if (!GuideNhServerStructureAccess.hasStructurePermission(player)) {
5265
send(player, GuidebookText.CommandStructurePermissionDenied);
5366
break;
5467
}
@@ -69,7 +82,7 @@ public IMessage onMessage(GuideNhStructureRequestMessage message, MessageContext
6982
message.getZ());
7083
break;
7184
case GuideNhStructureRequestMessage.ACTION_PLACE_ALL:
72-
if (!player.canCommandSenderUseCommand(3, "guidenh")) {
85+
if (!GuideNhServerStructureAccess.hasStructurePermission(player)) {
7386
send(player, GuidebookText.CommandStructurePermissionDenied);
7487
break;
7588
}
@@ -112,6 +125,13 @@ public static String getErrorMessage(Throwable throwable) {
112125
.getSimpleName();
113126
}
114127

128+
private static void pruneExpiredTransfers() {
129+
CHUNK_TRANSFERS.entrySet()
130+
.removeIf(
131+
entry -> entry.getValue()
132+
.isExpired());
133+
}
134+
115135
private static final class TransferKey {
116136

117137
private final UUID playerId;

0 commit comments

Comments
 (0)