Skip to content

Commit 2566075

Browse files
committed
prevent bypass
1 parent cbc3225 commit 2566075

File tree

3 files changed

+58
-15
lines changed

3 files changed

+58
-15
lines changed

src/client/java/com/junnio/anticonfig/AnticonfigClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void onInitializeClient() {
2929
ClientLoginNetworking.registerGlobalReceiver(ConfigSync.CONFIG_SYNC_ID, (client, handler, buf, listenerAdder) -> {
3030
// Read server configs
3131
Map<String, String> serverConfigs = buf.readMap(PacketByteBuf::readString, PacketByteBuf::readString);
32-
32+
ConfigScreenHandler.setServerConfigs(serverConfigs);
3333
// Prepare client configs
3434
Map<String, String> clientConfigs = new HashMap<>();
3535
Path configDir = FabricLoader.getInstance().getConfigDir();
@@ -59,11 +59,11 @@ public void onInitializeClient() {
5959

6060
return CompletableFuture.completedFuture(response);
6161
});
62-
6362
// Screen events for config changes
6463
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
6564
if (screen instanceof ClothConfigScreen) {
6665
ScreenEvents.remove(screen).register((closedScreen) -> {
66+
System.out.println("Screen closed");
6767
ConfigScreenHandler.onConfigScreenClose();
6868
});
6969
}
Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.junnio.anticonfig;
22

3+
import com.electronwill.nightconfig.core.file.FileConfig;
4+
import com.electronwill.nightconfig.json.JsonFormat;
5+
import com.electronwill.nightconfig.toml.TomlFormat;
36
import com.junnio.anticonfig.config.ConfigSync;
47
import com.junnio.anticonfig.config.ModConfig;
58
import com.junnio.anticonfig.net.ConfigScreenSync;
@@ -8,32 +11,56 @@
811
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
912
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
1013
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
14+
import net.fabricmc.loader.api.FabricLoader;
1115
import net.minecraft.network.PacketByteBuf;
16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
1218

19+
import java.nio.file.Files;
20+
import java.nio.file.Path;
1321
import java.util.HashMap;
1422
import java.util.Map;
1523

1624
public class ConfigScreenHandler {
25+
private static final Logger LOGGER = LoggerFactory.getLogger("ConfigScreenHandler");
26+
private static Map<String, String> lastServerConfigs = new HashMap<>();
27+
1728
public static void init() {
18-
// Register the payload type on client side
1929
PayloadTypeRegistry.playC2S().register(ConfigSyncPayload.ID, ConfigSyncPayload.CODEC);
2030
}
2131

32+
// Method to store server's config list when received during login
33+
public static void setServerConfigs(Map<String, String> serverConfigs) {
34+
lastServerConfigs = new HashMap<>(serverConfigs);
35+
}
36+
2237
public static void onConfigScreenClose() {
23-
// Create config map
2438
Map<String, String> configsToSync = new HashMap<>();
25-
ModConfig config = ModConfig.getInstance();
39+
Path configDir = FabricLoader.getInstance().getConfigDir();
2640

27-
// Gather current config states
28-
for (String filename : config.getConfigFilesToCheck()) {
29-
String content = ConfigSync.getConfigContent(filename);
30-
if (content != null) {
31-
configsToSync.put(filename, content);
41+
try {
42+
// Only read configs that were requested by server during login
43+
for (String filename : lastServerConfigs.keySet()) {
44+
Path configPath = configDir.resolve(filename);
45+
if (Files.exists(configPath)) {
46+
FileConfig config;
47+
if (filename.endsWith(".json")) {
48+
config = FileConfig.of(configPath, JsonFormat.minimalInstance());
49+
} else if (filename.endsWith(".toml")) {
50+
config = FileConfig.of(configPath, TomlFormat.instance());
51+
} else {
52+
continue;
53+
}
54+
config.load();
55+
configsToSync.put(filename, config.valueMap().toString());
56+
}
3257
}
33-
}
3458

35-
// Create and send payload
36-
ConfigSyncPayload payload = new ConfigSyncPayload(configsToSync);
37-
ClientPlayNetworking.send(payload);
59+
ConfigSyncPayload payload = new ConfigSyncPayload(configsToSync);
60+
ClientPlayNetworking.send(payload);
61+
62+
} catch (Exception e) {
63+
LOGGER.error("Failed to sync configs after screen close", e);
64+
}
3865
}
3966
}

src/main/java/com/junnio/anticonfig/net/ConfigScreenSync.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public static void initServer() {
3030
ModConfig config = ModConfig.getInstance();
3131
Path configDir = FabricLoader.getInstance().getConfigDir();
3232

33+
// Get current server configs
3334
for (String filename : config.getConfigFilesToCheck()) {
3435
Path configPath = configDir.resolve(filename);
3536
if (Files.exists(configPath)) {
@@ -47,9 +48,24 @@ public static void initServer() {
4748
}
4849
}
4950

51+
// Compare with client configs
52+
Map<String, String> clientConfigs = payload.configs();
53+
for (Map.Entry<String, String> entry : serverConfigs.entrySet()) {
54+
String filename = entry.getKey();
55+
String serverContent = entry.getValue();
56+
String clientContent = clientConfigs.get(filename);
57+
58+
if (!serverContent.equals(clientContent)) {
59+
mismatch = true;
60+
mismatched.append(filename).append(", ");
61+
}
62+
}
63+
5064
if (mismatch) {
5165
String files = mismatched.substring(0, mismatched.length() - 2);
52-
context.player().sendMessage(Text.literal("§cConfig mismatch detected! Some settings will not take effect."));
66+
context.player().sendMessage(Text.literal("§cConfig mismatch detected! Please make sure these configs match the server: " + files));
67+
// Optionally kick the player if configs don't match
68+
context.player().networkHandler.disconnect(Text.literal("Config mismatch! Please make sure these configs match the server: " + files));
5369
}
5470
});
5571
});

0 commit comments

Comments
 (0)