diff --git a/src/de/steamwar/bungeecore/listeners/mods/Fabric.java b/src/de/steamwar/bungeecore/listeners/mods/Fabric.java index 61ae91ac..6037c6ec 100644 --- a/src/de/steamwar/bungeecore/listeners/mods/Fabric.java +++ b/src/de/steamwar/bungeecore/listeners/mods/Fabric.java @@ -1,17 +1,40 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + package de.steamwar.bungeecore.listeners.mods; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.listeners.BasicListener; import de.steamwar.bungeecore.sql.Mod; -import io.netty.util.internal.StringUtil; -import net.md_5.bungee.api.connection.PendingConnection; +import de.steamwar.bungeecore.sql.Punishment; +import de.steamwar.bungeecore.sql.SteamwarUser; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.event.EventHandler; -import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; +import java.sql.Timestamp; +import java.time.Instant; +import java.util.*; +import java.util.logging.Level; public class Fabric extends BasicListener { @@ -20,26 +43,50 @@ public class Fabric extends BasicListener { if(!e.getTag().equals("fabricmodsender:mods")) return; - String dataString = new String(e.getData()).substring(2); - dataString = StringUtils.chop(dataString); - char x = 34; - dataString = dataString.replace(x, ' '); - dataString = dataString.replaceAll("\\s+",""); - - String[] parts = dataString.split(","); - - List mods = new ArrayList<>(); - - for(String mod : parts) { - mods.add(Mod.get(mod, Mod.Platform.FABRIC)); + if (!(e.getSender() instanceof ProxiedPlayer)) { + return; } - if (e.getSender() instanceof ProxiedPlayer) { - ProxiedPlayer player = (ProxiedPlayer) e.getSender(); + ProxiedPlayer player = (ProxiedPlayer) e.getSender(); - if(!Utils.handleMods(player, mods)) - player.disconnect(""); + List mods = new LinkedList<>(); + + String dataString = new String(e.getData()).substring(1); + String dataString2 = "{:" + dataString + "}"; + + System.out.println(dataString2); + + try { + JsonArray array = new JsonParser().parse(dataString).getAsJsonArray(); + + for(int i = 0; i < array.size(); i++) { + mods.add(Mod.get(array.get(i).getAsString(), Mod.Platform.FABRIC)); + } + + boolean isSorted = isSortedAlphabetically(mods); + + if(!isSorted) { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + user.punish(Punishment.PunishmentType.Ban, Timestamp.from(Instant.now()), "§7Du hast probiert den FabricModSender zu umgehen!", 0, true); + BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch gebannt, da er den FabricModSender editiert hatte"); + return; + } + + Utils.handleMods(player,mods); + }catch (Exception ex) { + ex.printStackTrace(); + player.disconnect("§7Mod Verification failed! Contact a Developer"); } } + private boolean isSortedAlphabetically(List mods) { + boolean isSorted = true; + for(int i = 0; i < mods.size() - 1; i++) { + if(mods.get(i).getModName().compareToIgnoreCase(mods.get(i + 1).getModName()) > 0) { + isSorted = false; + break; + } + } + return isSorted; + } }