sten.wtf / STEN Vault source

In-house snapshot of sten-vault 2.3.2. GPL-3.0-or-later. Isolated from the dashboard.

src/main/java/wtf/sten/vault/SessionSwap.java

package wtf.sten.vault;

import com.google.gson.JsonObject;
import net.minecraft.client.Minecraft;
import net.minecraft.client.User;
import net.minecraft.client.gui.screens.TitleScreen;
import wtf.sten.vault.mixin.MinecraftAccess;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Optional;
import java.util.UUID;

public final class SessionSwap {
	private SessionSwap() {
	}

	public static void apply(JsonObject minted) {
		String token = str(minted, "accessToken");
		String name = str(minted, "username");
		if (token.isEmpty() || name.isEmpty()) {
			throw new IllegalStateException("sten.wtf did not return a Minecraft session");
		}
		UUID uuid = uuidOf(minted);
		if (uuid == null) {
			throw new IllegalStateException("sten.wtf did not return a Minecraft UUID");
		}
		Minecraft mc = Minecraft.getInstance();
		if (mc.level != null) {
			mc.disconnect(new TitleScreen(), false);
		}
		MinecraftAccess access = (MinecraftAccess) mc;
		User user = new User(name, uuid, token, Optional.empty(), Optional.empty());
		access.sten$setUser(user);
		StenNet.session.selectedName = name;
		StenNet.session.save();
		StenNet.status = "Playing as " + name + " · sten.wtf";
	}

	static UUID uuidOf(JsonObject minted) {
		UUID uuid = parseUuid(str(minted, "uuid"));
		if (uuid != null) return uuid;
		JsonObject claims = jwtClaims(str(minted, "accessToken"));
		if (claims != null) {
			uuid = parseUuid(str(claims, "spr"));
			if (uuid != null) return uuid;
			uuid = parseUuid(str(claims, "profileId"));
			if (uuid != null) return uuid;
			uuid = parseUuid(str(claims, "sub"));
			if (uuid != null) return uuid;
		}
		return null;
	}

	public static UUID parseUuid(String raw) {
		if (raw == null) return null;
		String value = raw.trim();
		if (value.isEmpty()) return null;
		try {
			if (value.contains("-")) return UUID.fromString(value);
			if (value.length() == 32) {
				return UUID.fromString(value.replaceFirst(
					"(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{12})",
					"$1-$2-$3-$4-$5"));
			}
		} catch (Exception ignored) {
		}
		return null;
	}

	private static JsonObject jwtClaims(String token) {
		try {
			String[] parts = token.split("\\.");
			if (parts.length < 2) return null;
			byte[] json = Base64.getUrlDecoder().decode(parts[1]);
			return com.google.gson.JsonParser.parseString(new String(json, StandardCharsets.UTF_8)).getAsJsonObject();
		} catch (Exception ignored) {
			return null;
		}
	}

	private static String str(JsonObject obj, String key) {
		if (obj == null || !obj.has(key) || obj.get(key).isJsonNull()) return "";
		try {
			return obj.get(key).getAsString();
		} catch (Exception ignored) {
			return "";
		}
	}
}