Skip to content

Commit

Permalink
Store additional display claims returned by XSTS step
Browse files Browse the repository at this point in the history
Closes #26
  • Loading branch information
RaphiMC committed Jun 19, 2024
1 parent eefd2d2 commit 99bed8b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

import java.time.Instant;
import java.time.ZoneId;
import java.util.Map;

public class StepXblSisuAuthentication extends AbstractStep<StepInitialXblSession.InitialXblSession, StepXblSisuAuthentication.XblSisuTokens> {

Expand Down Expand Up @@ -134,6 +135,11 @@ public String getUserHash() {
return this.xstsToken.getUserHash();
}

@Override
public Map<String, String> getDisplayClaims() {
return this.xstsToken.getDisplayClaims();
}

@Override
public StepFullXblSession.FullXblSession getFullXblSession() {
return this.xstsToken.getFullXblSession();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,14 @@
import net.raphimc.minecraftauth.step.xbl.session.StepInitialXblSession;
import net.raphimc.minecraftauth.util.CryptUtil;
import net.raphimc.minecraftauth.util.JsonContent;
import net.raphimc.minecraftauth.util.JsonUtil;
import org.jetbrains.annotations.ApiStatus;

import java.time.Instant;
import java.time.ZoneId;
import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;

public class StepXblXstsToken extends AbstractStep<StepFullXblSession.FullXblSession, StepXblXstsToken.XblXstsToken> {

Expand Down Expand Up @@ -103,24 +107,30 @@ public static class XblXstsToken extends XblXsts<StepFullXblSession.FullXblSessi
long expireTimeMs;
String token;
String userHash;
Map<String, String> displayClaims;
StepFullXblSession.FullXblSession fullXblSession;

@ApiStatus.Internal
public static XblXstsToken fromMicrosoftJson(final JsonObject obj, final StepFullXblSession.FullXblSession fullXblSession) {
final JsonObject displayClaims = obj.getAsJsonObject("DisplayClaims").getAsJsonArray("xui").get(0).getAsJsonObject();
final Map<String, String> displayClaimsMap = displayClaims.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getAsString()));
return new XblXstsToken(
Instant.parse(obj.get("NotAfter").getAsString()).toEpochMilli(),
obj.get("Token").getAsString(),
obj.getAsJsonObject("DisplayClaims").getAsJsonArray("xui").get(0).getAsJsonObject().get("uhs").getAsString(),
displayClaims.get("uhs").getAsString(),
Collections.unmodifiableMap(displayClaimsMap),
fullXblSession
);
}

@ApiStatus.Internal
public static XblXstsToken fromJson(final JsonObject json, final StepFullXblSession.FullXblSession fullXblSession) {
final JsonObject displayClaims = JsonUtil.getObjectNonNull(json, "displayClaims");
return new XblXstsToken(
json.get("expireTimeMs").getAsLong(),
json.get("token").getAsString(),
json.get("userHash").getAsString(),
Collections.unmodifiableMap(displayClaims.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getAsString()))),
fullXblSession
);
}
Expand All @@ -131,6 +141,7 @@ public static JsonObject toJson(final XblXstsToken xblXstsToken) {
json.addProperty("expireTimeMs", xblXstsToken.expireTimeMs);
json.addProperty("token", xblXstsToken.token);
json.addProperty("userHash", xblXstsToken.userHash);
json.add("displayClaims", JsonUtil.GSON.toJsonTree(xblXstsToken.displayClaims));
return json;
}

Expand All @@ -154,6 +165,8 @@ public abstract static class XblXsts<P extends AbstractStep.StepResult<?>> exten

public abstract String getUserHash();

public abstract Map<String, String> getDisplayClaims();

public String getServiceToken() {
return this.getUserHash() + ';' + this.getToken();
}
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/net/raphimc/minecraftauth/util/JsonUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,13 @@ public static long getLongOr(final JsonObject obj, final String key, final long
}
}

public static JsonObject getObjectNonNull(final JsonObject obj, final String key) {
final JsonElement element = obj.get(key);
if (element != null && !element.isJsonNull()) {
return element.getAsJsonObject();
} else {
return new JsonObject();
}
}

}

0 comments on commit 99bed8b

Please sign in to comment.