Skip to content

Commit

Permalink
Send a hash rather than the raw key over the network
Browse files Browse the repository at this point in the history
lukeeey committed May 29, 2024
1 parent 788e9f2 commit 4d283b9
Showing 11 changed files with 375 additions and 301 deletions.
15 changes: 1 addition & 14 deletions blockbench-plugin/src/index.ts
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@ import { loadStyles } from "./screens/style-registry";
import { createConfigureDialog } from "./screens/configure/dialog";
import { createConnectDialog } from "./screens/connect/dialog";
import { createExportDialog, createExportModelDialog } from "./screens/export/dialog";
import { playerListInterval, updatePlayerList } from "./utils";

(function () {
BBPlugin.register("benchkit", {
@@ -87,20 +88,6 @@ function initKeybinds() {

}

let playerListInterval: number;

export function updatePlayerList() {
let fetchPlayerList = function () {
if (!config.fetchPlayerList) {
globals.playerList = [];
return window.clearInterval(playerListInterval);
}
socket.send("fetch_player_list", {});
}
fetchPlayerList()
playerListInterval = window.setInterval(fetchPlayerList, 10 * 1000);
}

Blockbench.on("benchkit_prefs_updated", (data: any) => {
if (data.fetch_player_list && globals.playerList.length === 0) {
updatePlayerList()
6 changes: 3 additions & 3 deletions blockbench-plugin/src/socket.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import config from "./config";
import globals from "./globals";
import { updatePlayerList } from "./index";
import { createSHA256Hash, updatePlayerList } from "./utils";

class BenchkitSocket {
private socket?: WebSocket;
@@ -15,8 +15,8 @@ class BenchkitSocket {
}
this.socket = new WebSocket(`ws://${address}:${port}`);

this.socket.onopen = (event) => {
this.key = key;
this.socket.onopen = async (event) => {
this.key = await createSHA256Hash(key);
this.address = address;
this.port = port;
this.onOpen(event);
28 changes: 28 additions & 0 deletions blockbench-plugin/src/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import config from "./config";
import globals from "./globals";
import socket from "./socket";

export let playerListInterval: number;

export function updatePlayerList() {
let fetchPlayerList = function () {
if (!config.fetchPlayerList) {
globals.playerList = [];
return window.clearInterval(playerListInterval);
}
socket.send("fetch_player_list", {});
}
fetchPlayerList()
playerListInterval = window.setInterval(fetchPlayerList, 10 * 1000);
}

// https://stackoverflow.com/a/67600346
export async function createSHA256Hash(input: string) {
const textAsBuffer = new TextEncoder().encode(input);
const hashBuffer = await window.crypto.subtle.digest("SHA-256", textAsBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hash = hashArray
.map((item) => item.toString(16).padStart(2, "0"))
.join("");
return hash;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package dev.opencollab.benchkit.cloudburst;

import java.awt.image.BufferedImage;
import java.net.InetSocketAddress;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;

import org.cloudburstmc.server.Server;
import org.cloudburstmc.server.player.Player;
import org.slf4j.Logger;

import com.nukkitx.protocol.bedrock.data.skin.ImageData;
import com.nukkitx.protocol.bedrock.data.skin.SerializedSkin;
import com.nukkitx.protocol.bedrock.packet.PlayerSkinPacket;

import dev.opencollab.benchkit.BenchkitPlugin;
import dev.opencollab.benchkit.cloudburst.event.ModelApplyEvent;
import dev.opencollab.benchkit.cloudburst.event.SkinApplyEvent;

public class CloudBenchkitAdapter implements BenchkitPlugin {
private final CloudBenchkitPlugin plugin;
private final Server server;
private final Logger logger;

public CloudBenchkitAdapter(CloudBenchkitPlugin plugin, Server server, Logger logger) {
this.plugin = plugin;
this.server = server;
this.logger = logger;
}

@Override
public boolean playerExists(UUID uuid) {
return server.getPlayer(uuid).isPresent();
}

@Override
public Map<UUID, String> getOnlinePlayers() {
Map<UUID, String> players = new HashMap<>();
server.getOnlinePlayers().forEach((uuid, player) -> players.put(uuid, player.getName()));
return players;
}

@Override
public void applySkin(UUID playerUuid, BufferedImage image) {
Optional<Player> playerOptional = server.getPlayer(playerUuid);
if (!playerOptional.isPresent()) {
throw new IllegalArgumentException("Player not found");
}

Player player = playerOptional.get();
SerializedSkin oldSkin = player.getSkin();
String name = UUID.randomUUID().toString();

SerializedSkin skin = SerializedSkin.builder()
.geometryData(oldSkin.getGeometryData())
.skinResourcePatch(oldSkin.getSkinResourcePatch())
.skinData(ImageData.from(image))
.skinId(name)
.premium(true)
.build();

server.getEventManager().fire(new SkinApplyEvent(player, skin));

player.setSkin(skin);

PlayerSkinPacket packet = new PlayerSkinPacket();
packet.setSkin(skin);
packet.setNewSkinName(name);
packet.setOldSkinName(oldSkin.getSkinId());
packet.setUuid(player.getServerId());

Server.broadcastPacket(server.getOnlinePlayers().values(), packet);
}

@Override
public void applySkinWithModel(UUID playerUuid, String identifier, String geometryData, BufferedImage image) {
Optional<Player> playerOptional = server.getPlayer(playerUuid);
if (!playerOptional.isPresent()) {
throw new IllegalArgumentException("Player not found");
}

Player player = playerOptional.get();
SerializedSkin oldSkin = player.getSkin();
String name = UUID.randomUUID().toString();

SerializedSkin skin = SerializedSkin.builder()
.geometryData(geometryData)
.geometryName("geometry." + identifier)
.skinData(ImageData.from(image))
.skinId(name)
.premium(true)
.build();

server.getEventManager().fire(new ModelApplyEvent(player, skin));

player.setSkin(skin);

PlayerSkinPacket packet = new PlayerSkinPacket();
packet.setSkin(skin);
packet.setNewSkinName(name);
packet.setOldSkinName(oldSkin.getSkinId());
packet.setUuid(player.getServerId());

Server.broadcastPacket(server.getOnlinePlayers().values(), packet);
}

@Override
public void scheduleDelayedTask(Runnable task, int delay) {
server.getScheduler().scheduleDelayedTask(plugin.getContainer(), task, delay);
}

@Override
public int getAuthenticationTimeout() {
return plugin.getConfig().getAuthenticationTimeout();
}

@Override
public String getAuthenticationKey() {
return plugin.getConfig().getKey();
}

@Override
public Path getDataPath() {
return plugin.getDataFolder();
}

@Override
public InetSocketAddress getSocketAddress() {
return plugin.getAddress();
}

@Override
public void logInfo(String message) {
logger.info(message);
}

@Override
public void logWarning(String message) {
logger.warn(message);
}

@Override
public void logError(String message) {
logger.error(message);
}
}
Loading

0 comments on commit 4d283b9

Please sign in to comment.