1
0
mirror of https://github.com/GeyserMC/Floodgate.git synced 2025-12-19 14:59:20 +00:00

Changed the plugin name and it can now receive RawSkins

This commit is contained in:
Tim203
2020-09-19 15:49:29 +02:00
parent 974a6d96c5
commit 35d6622f8f
7 changed files with 54 additions and 24 deletions

View File

@@ -1,4 +1,4 @@
name: ${outputName}
name: ${project.parent.version}
description: ${project.description}
version: ${project.version}
author: ${project.organization.name}

View File

@@ -60,7 +60,7 @@ public final class FloodgatePlayerImpl implements FloodgatePlayer {
@Setter
private boolean login = true;
FloodgatePlayerImpl(BedrockData data, String prefix, boolean replaceSpaces) {
FloodgatePlayerImpl(BedrockData data, RawSkin skin, String prefix, boolean replaceSpaces) {
FloodgateApi api = FloodgateApi.getInstance();
version = data.getVersion();
username = data.getUsername();

View File

@@ -26,16 +26,17 @@
package org.geysermc.floodgate;
import com.google.common.base.Charsets;
import com.google.inject.Inject;
import lombok.*;
import org.geysermc.floodgate.api.SimpleFloodgateApi;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.config.FloodgateConfig;
import org.geysermc.floodgate.crypto.AesCipher;
import org.geysermc.floodgate.crypto.FloodgateCipher;
import org.geysermc.floodgate.util.BedrockData;
import org.geysermc.floodgate.util.InvalidHeaderException;
import java.util.Base64;
import org.geysermc.floodgate.util.InvalidFormatException;
import org.geysermc.floodgate.util.RawSkin;
import static org.geysermc.floodgate.util.BedrockData.EXPECTED_LENGTH;
@@ -57,35 +58,67 @@ public final class HandshakeHandler {
public HandshakeResult handle(@NonNull String handshakeData) {
try {
String[] data = handshakeData.split("\0");
String[] dataArray = handshakeData.split("\0");
boolean isBungeeData = data.length == 5;
boolean isBungeeData = dataArray.length == 5;
// this can be Bungee data (without skin) or Floodgate data
if (data.length == 4) {
isBungeeData = FloodgateCipher.hasHeader(data[3]);
if (dataArray.length == 4) {
isBungeeData = FloodgateCipher.hasHeader(dataArray[3]);
}
if (proxy && isBungeeData || !isBungeeData && data.length != 2) {
if (proxy && isBungeeData || !isBungeeData && dataArray.length != 2) {
return ResultType.NOT_FLOODGATE_DATA.getCachedResult();
}
String decrypted = cipher.decryptToString(Base64.getDecoder().decode(data[1]));
// calculate the expected Base64 encoded IV length.
int expectedIvLength = 4 * ((AesCipher.IV_LENGTH + 2) / 3);
int lastSplitIndex = dataArray[1].lastIndexOf(0x21);
byte[] floodgateData;
byte[] rawSkinData = null;
// if it has a RawSkin
if (lastSplitIndex - expectedIvLength != 0) {
floodgateData = dataArray[1].substring(0, lastSplitIndex).getBytes(Charsets.UTF_8);
rawSkinData = dataArray[1].substring(lastSplitIndex + 1).getBytes(Charsets.UTF_8);
} else {
floodgateData = dataArray[1].getBytes(Charsets.UTF_8);
}
// actual decryption
String decrypted = cipher.decryptToString(floodgateData);
BedrockData bedrockData = BedrockData.fromString(decrypted);
if (bedrockData.getDataLength() != EXPECTED_LENGTH) {
return ResultType.INVALID_DATA_LENGTH.getCachedResult();
}
RawSkin rawSkin = null;
// only decompile the skin after knowing that the floodgateData is legit
// note that we don't store a hash or anything in the BedrockData,
// so a mitm can change skins
if (rawSkinData != null) {
rawSkin = RawSkin.decode(rawSkinData);
}
System.out.println(rawSkin);
FloodgatePlayer player =
new FloodgatePlayerImpl(bedrockData, usernamePrefix, replaceSpaces);
new FloodgatePlayerImpl(bedrockData, rawSkin, usernamePrefix, replaceSpaces);
api.addPlayer(player.getJavaUniqueId(), player);
return new HandshakeResult(ResultType.SUCCESS, data, bedrockData, player);
} catch (InvalidHeaderException headerException) {
return new HandshakeResult(ResultType.SUCCESS, dataArray, bedrockData, player);
} catch (InvalidFormatException formatException) {
// only header exceptions should return 'not floodgate data',
// all the other format exceptions are because of invalid/tempered Floodgate data
if (formatException.isHeader()) {
return ResultType.NOT_FLOODGATE_DATA.getCachedResult();
}
formatException.printStackTrace();
return ResultType.EXCEPTION.getCachedResult();
} catch (Exception exception) {
exception.printStackTrace();
System.out.println(handshakeData);
return ResultType.EXCEPTION.getCachedResult();
}
}

View File

@@ -42,10 +42,7 @@ import org.geysermc.floodgate.config.FloodgateConfig;
import org.geysermc.floodgate.config.loader.ConfigLoader;
import org.geysermc.floodgate.config.updater.ConfigFileUpdater;
import org.geysermc.floodgate.config.updater.ConfigUpdater;
import org.geysermc.floodgate.crypto.AesCipher;
import org.geysermc.floodgate.crypto.AesKeyProducer;
import org.geysermc.floodgate.crypto.FloodgateCipher;
import org.geysermc.floodgate.crypto.KeyProducer;
import org.geysermc.floodgate.crypto.*;
import org.geysermc.floodgate.inject.CommonPlatformInjector;
import org.geysermc.floodgate.link.PlayerLinkLoader;
@@ -70,7 +67,7 @@ public final class CommonModule extends AbstractModule {
@Provides
@Singleton
public FloodgateCipher cipher() {
return new AesCipher();
return new AesCipher(new Base64Topping());
}
@Provides

View File

@@ -21,7 +21,7 @@
<url>https://github.com/GeyserMC/Floodgate</url>
<properties>
<geyser.version>1.0.0</geyser.version>
<geyser.version>1.1.0</geyser.version>
<bukkit.version>1.8.8-R0.1-SNAPSHOT</bukkit.version>
<bungee.version>1.15-SNAPSHOT</bungee.version>
<velocity.version>1.1.0-SNAPSHOT</velocity.version>

View File

@@ -1,4 +1,4 @@
name: ${outputName}
name: ${project.parent.name}
description: ${project.description}
version: ${project.version}
author: ${project.organization.name}

View File

@@ -1 +1 @@
{"id": "${project.parent.name}", "name": "${outputName}", "version": "${project.version}", "description": "${project.description}", "url": "${project.url}", "authors": ["${project.organization.name}"], "main": "org.geysermc.floodgate.VelocityPlugin"}
{"id": "${project.parent.name}", "name": "${project.parent.name}", "version": "${project.version}", "description": "${project.description}", "url": "${project.url}", "authors": ["${project.organization.name}"], "main": "org.geysermc.floodgate.VelocityPlugin"}