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 "";
}
}
}