SteamWar/BungeeCore
Archiviert
13
2

Forge Mod detection #292

Zusammengeführt
Lixfel hat 11 Commits von ModDetection1.13+ nach master 2022-02-03 22:06:16 +01:00 zusammengeführt
4 geänderte Dateien mit 52 neuen und 61 gelöschten Zeilen
Nur Änderungen aus Commit 28946876cf werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -1,43 +1,48 @@
/*
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Fehlender License-Header

Fehlender License-Header
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 <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.listeners.mods;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.sql.Mod;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.api.event.PreLoginEvent;
import net.md_5.bungee.api.plugin.Event;
import net.md_5.bungee.netty.ChannelWrapper;
import net.md_5.bungee.netty.PacketHandler;
import net.md_5.bungee.protocol.packet.LoginPayloadResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class CustomPacketHandler extends PacketHandler {
private LoginEvent event;
private ChannelWrapper wrapper;
public CustomPacketHandler(LoginEvent event, ChannelWrapper wrapper) {
public CustomPacketHandler(LoginEvent event) {
this.event = event;
this.wrapper = wrapper;
}
@Override public String toString() {
@Override
public String toString() {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Besteht hier wirklich die Notwendigkeit, toString zu überschreiben?

Besteht hier wirklich die Notwendigkeit, toString zu überschreiben?
Veraltet
Review

ja, ansonsten meckert intellij rum.

ja, ansonsten meckert intellij rum.
return null;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Diese Zeile bitte in der Production-Fassung entfernen.

Diese Zeile bitte in der Production-Fassung entfernen.
}
public void handle(LoginPayloadResponse response){
if(response.getData() == null) {
Veraltet
Review

Noch fehlende Modprüfung :)

Noch fehlende Modprüfung :)
System.out.println("Data is null with id: " + response.getId() + " , which means Client has no installed mods!");
event.completeIntent(BungeeCore.get());
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich finde es hier gefährlich, dass du hier den PacketHandler nicht zurück auf den InitialHandler setzt (deshalb hat es wahrscheinlich auch nicht mit dem PreLoginEvent geklappt).

Es dürfte aber durch dadurch, dass LoginEvent.completeIntent dazu führt, dass es dann entweder einen Disconnect oder direkt den PlayHandler gibt, egal sein. Daher entweder den Packethandler zurücksetzen oder sich gar nicht hier den Wrapper merken (wozu brauchst du den sonst hier).

Ich finde es hier gefährlich, dass du hier den PacketHandler nicht zurück auf den InitialHandler setzt (deshalb hat es wahrscheinlich auch nicht mit dem PreLoginEvent geklappt). Es dürfte aber durch dadurch, dass LoginEvent.completeIntent dazu führt, dass es dann entweder einen Disconnect oder direkt den PlayHandler gibt, egal sein. Daher entweder den Packethandler zurücksetzen oder sich gar nicht hier den Wrapper merken (wozu brauchst du den sonst hier).
return;
}
byte[] data = response.getData();
event.completeIntent(BungeeCore.get());
}

Datei anzeigen

@ -1,3 +1,21 @@
/*
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Fehlender License-Header

Fehlender License-Header
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 <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.listeners.mods;
import net.md_5.bungee.api.ServerPing;

Datei anzeigen

@ -19,6 +19,7 @@
package de.steamwar.bungeecore.listeners.mods;
import com.google.common.collect.ImmutableMap;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.listeners.BasicListener;
import de.steamwar.bungeecore.sql.Mod;
@ -41,14 +42,13 @@ import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
public class Forge extends BasicListener {
private static final String FMLHS = "FML|HS";
private static final String FMLHS13 = "fml:handshake";
private static final String WRAPPER = "fml:loginwrapper";
private static final byte[] REGISTER;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte nicht vergessen, den alten 1.13 Forge-Support auszubauen :) (Aber bitte den 1.12- Support drin lassen!)

Du kannst dann auch ich glaube im Fabric-Modhandler? den Arenenblock für Forge-Spieler ausbauen.

Bitte nicht vergessen, den alten 1.13 Forge-Support auszubauen :) (Aber bitte den 1.12- Support drin lassen!) Du kannst dann auch ich glaube im Fabric-Modhandler? den Arenenblock für Forge-Spieler ausbauen.
private static final byte[] REGISTER13;
private static final byte[] HELLO = new byte[]{0, 2, 0, 0, 0, 0};
private static final Set<UUID> unlocked = new HashSet<>();
@ -58,37 +58,28 @@ public class Forge extends BasicListener {
buf.writeCharSequence(FMLHS, StandardCharsets.UTF_8);
REGISTER = new byte[buf.readableBytes()];
buf.readBytes(REGISTER);
buf.clear();
buf.writeByte(13);
buf.writeCharSequence(FMLHS13, StandardCharsets.UTF_8);
REGISTER13 = new byte[buf.readableBytes()];
buf.readBytes(REGISTER13);
}
@EventHandler
public void onServerConnected(LoginEvent event){
//Wir senden Packet ID 1
//Wir wollen empfangen Packet ID 2
//(FMLHS13, new byte[]{4, 1, 0, 0, 0});
//13,102,109,108,58,104,97,110,100,115,104,97,107,101 = 13 + "fml:handshake"
if(event.getConnection().getVersion() < 340) return; //1.13+
event.getConnection().unsafe().sendPacket(new LoginPayloadRequest(1,WRAPPER, new byte[]{13,102,109,108,58,104,97,110,100,115,104,97,107,101,4,1,0,0,0}));
event.registerIntent(BungeeCore.get());
InitialHandler handler = (InitialHandler) event.getConnection();
Field ch;
ChannelWrapper wrapper = null;
ChannelWrapper wrapper;
try{
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Die Kommentarzeile (und ggf. noch die Zeilen drüber) können weg.

Die Kommentarzeile (und ggf. noch die Zeilen drüber) können weg.
ch = handler.getClass().getDeclaredField("ch");
ch.setAccessible(true);
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier vorher noch eine Prüfung, dass der Client 1.13 oder höhere Version hat (in dem Fall einfach return). 1.12 und niedriger kennt nämlich keine LoginPayloadRequests.

Hier vorher noch eine Prüfung, dass der Client 1.13 oder höhere Version hat (in dem Fall einfach return). 1.12 und niedriger kennt nämlich keine LoginPayloadRequests.
wrapper = (ChannelWrapper) ch.get(handler);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not get Channel", e);
return;
}
wrapper.getHandle().pipeline().get(HandlerBoss.class).setHandler(new CustomPacketHandler(event, wrapper));
event.registerIntent(BungeeCore.get());
wrapper.getHandle().pipeline().get(HandlerBoss.class).setHandler(new CustomPacketHandler(event));
}
@EventHandler
@ -107,10 +98,7 @@ public class Forge extends BasicListener {
}
}
if(player.getPendingConnection().getVersion() > 340) {
player.sendData("minecraft:register", REGISTER13); //1.13+
player.sendData(FMLHS13, Forge.HELLO);
}else{
if(player.getPendingConnection().getVersion() <= 340) {
player.sendData("REGISTER", REGISTER); //1.12-
player.sendData(FMLHS, Forge.HELLO);
}
@ -118,7 +106,7 @@ public class Forge extends BasicListener {
@EventHandler
public void onPluginMessageEvent(PluginMessageEvent e){
if(!e.getTag().equals(FMLHS) && !e.getTag().equals(FMLHS13))
if(!e.getTag().equals(FMLHS))
return;
e.setCancelled(true);

Datei anzeigen

@ -56,26 +56,6 @@ public class ModLoaderBlocker extends BasicListener {
}
}
@EventHandler
public void onPluginMessage(PluginMessageEvent e){
if(!e.getTag().equals("minecraft:register"))
return;
Connection sender = e.getSender();
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer p = (ProxiedPlayer) sender;
if(p.getPendingConnection().getVersion() <= 340)
return;
String registered = new String(e.getData(), StandardCharsets.UTF_8);
if(registered.contains("fml:loginwrapper") || registered.contains("fml:handshake") || registered.contains("fml:play")){
Storage.fabricPlayers.add(p);
Message.send("MODLOADER_INSTALLED", p, "Forge");
}
}
@EventHandler
public void onDisconnect(PlayerDisconnectEvent e){
Storage.fabricPlayers.remove(e.getPlayer());