Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ static AuthlibInjectorAccount fromStorage(
Map<String, String> properties = JsonUtils.GSON.fromJson(
profilePropertiesObject,
JsonUtils.mapTypeOf(String.class, String.class));
GameProfile selected = session.getSelectedProfile();
GameProfile selected = session.selectedProfile();
ObservableOptionalCache<UUID, CompleteGameProfile, AuthenticationException> profileRepository =
server.getYggdrasilService().getProfileRepository();
profileRepository.put(selected.getId(), new CompleteGameProfile(selected, properties));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ protected YggdrasilAccount(AccountID accountID, YggdrasilService service, String
super(accountID);
this.service = requireNonNull(service);
this.loginName = requireNonNull(loginName);
this.profileID = requireNonNull(session.getSelectedProfile().getId());
this.profileID = requireNonNull(session.selectedProfile().getId());
this.session = requireNonNull(session);

addProfilePropertiesListener();
Expand All @@ -55,23 +55,23 @@ protected YggdrasilAccount(YggdrasilService service, String loginName, String pa
this.loginName = requireNonNull(loginName);

YggdrasilSession acquiredSession = service.authenticate(loginName, password, randomClientToken());
if (acquiredSession.getSelectedProfile() == null) {
if (acquiredSession.getAvailableProfiles() == null || acquiredSession.getAvailableProfiles().isEmpty()) {
if (acquiredSession.selectedProfile() == null) {
if (acquiredSession.availableProfiles() == null || acquiredSession.availableProfiles().isEmpty()) {
throw new NoCharacterException();
}

GameProfile characterToSelect = selector.select(service, acquiredSession.getAvailableProfiles());
GameProfile characterToSelect = selector.select(service, acquiredSession.availableProfiles());

session = service.refresh(
acquiredSession.getAccessToken(),
acquiredSession.getClientToken(),
acquiredSession.accessToken(),
acquiredSession.clientToken(),
characterToSelect);
// response validity has been checked in refresh()
} else {
session = acquiredSession;
}

profileID = session.getSelectedProfile().getId();
profileID = session.selectedProfile().getId();
authenticated = true;

addProfilePropertiesListener();
Expand All @@ -93,32 +93,32 @@ public String getLoginName() {

@Override
public String getProfileName() {
return session.getSelectedProfile().getName();
return session.selectedProfile().getName();
}

@Override
public UUID getProfileID() {
return session.getSelectedProfile().getId();
return session.selectedProfile().getId();
}

@Override
public synchronized AuthInfo logIn() throws AuthenticationException {
if (!authenticated || !session.hasProfileName()) {
if (session.hasProfileName() && service.validate(session.getAccessToken(), session.getClientToken())) {
if (session.hasProfileName() && service.validate(session.accessToken(), session.clientToken())) {
authenticated = true;
} else {
YggdrasilSession acquiredSession;
try {
acquiredSession = service.refresh(session.getAccessToken(), session.getClientToken(), null);
acquiredSession = service.refresh(session.accessToken(), session.clientToken(), null);
} catch (RemoteAuthenticationException e) {
if ("ForbiddenOperationException".equals(e.getRemoteName())) {
throw new CredentialExpiredException(e);
} else {
throw e;
}
}
if (acquiredSession.getSelectedProfile() == null ||
!acquiredSession.getSelectedProfile().getId().equals(profileID)) {
if (acquiredSession.selectedProfile() == null ||
!acquiredSession.selectedProfile().getId().equals(profileID)) {
throw new ServerResponseMalformedException("Selected profile changed");
}
if (!acquiredSession.hasProfileName()) {
Expand All @@ -139,23 +139,23 @@ public synchronized AuthInfo logIn() throws AuthenticationException {
public synchronized AuthInfo logInWithPassword(String password) throws AuthenticationException {
YggdrasilSession acquiredSession = service.authenticate(loginName, password, randomClientToken());

if (acquiredSession.getSelectedProfile() == null) {
if (acquiredSession.getAvailableProfiles() == null || acquiredSession.getAvailableProfiles().isEmpty()) {
if (acquiredSession.selectedProfile() == null) {
if (acquiredSession.availableProfiles() == null || acquiredSession.availableProfiles().isEmpty()) {
throw new CharacterDeletedException();
}

GameProfile characterToSelect = acquiredSession.getAvailableProfiles().stream()
GameProfile characterToSelect = acquiredSession.availableProfiles().stream()
.filter(charatcer -> charatcer.getId().equals(profileID))
.findFirst()
.orElseThrow(CharacterDeletedException::new);

session = service.refresh(
acquiredSession.getAccessToken(),
acquiredSession.getClientToken(),
acquiredSession.accessToken(),
acquiredSession.clientToken(),
characterToSelect);

} else {
if (!acquiredSession.getSelectedProfile().getId().equals(profileID)) {
if (!acquiredSession.selectedProfile().getId().equals(profileID)) {
throw new CharacterDeletedException();
}
session = acquiredSession;
Expand Down Expand Up @@ -221,7 +221,7 @@ public boolean canUploadSkin() {

@Override
public void uploadSkin(boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException {
service.uploadSkin(profileID, session.getAccessToken(), isSlim, file);
service.uploadSkin(profileID, session.accessToken(), isSlim, file);
}

private static String randomClientToken() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ public YggdrasilSession refresh(String accessToken, String clientToken, GameProf
YggdrasilSession response = handleAuthenticationResponse(request(provider.getRefreshmentURL(), request), clientToken);

if (characterToSelect != null) {
if (response.getSelectedProfile() == null ||
!response.getSelectedProfile().getId().equals(characterToSelect.getId())) {
if (response.selectedProfile() == null ||
!response.selectedProfile().getId().equals(characterToSelect.getId())) {
throw new ServerResponseMalformedException("Failed to select character");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,53 +30,16 @@
import java.util.*;
import java.util.stream.Collectors;

/// @param selectedProfile nullable (null if no character is selected)
/// @param availableProfiles nullable (null if the YggdrasilSession is loaded from storage)
@Immutable
public class YggdrasilSession {

private final String clientToken;
private final String accessToken;
private final GameProfile selectedProfile;
private final List<GameProfile> availableProfiles;

@Nullable
private final Map<String, String> userProperties;

public YggdrasilSession(String clientToken, String accessToken, GameProfile selectedProfile, List<GameProfile> availableProfiles, Map<String, String> userProperties) {
this.clientToken = clientToken;
this.accessToken = accessToken;
this.selectedProfile = selectedProfile;
this.availableProfiles = availableProfiles;
this.userProperties = userProperties;
public record YggdrasilSession(String clientToken, String accessToken, @Nullable GameProfile selectedProfile,
List<GameProfile> availableProfiles, @Nullable Map<String, String> userProperties) {

public YggdrasilSession {
if (accessToken != null) Logger.registerAccessToken(accessToken);
}

public String getClientToken() {
return clientToken;
}

public String getAccessToken() {
return accessToken;
}

/**
* @return nullable (null if no character is selected)
*/
public GameProfile getSelectedProfile() {
return selectedProfile;
}

/**
* @return nullable (null if the YggdrasilSession is loaded from storage)
*/
public List<GameProfile> getAvailableProfiles() {
return availableProfiles;
}

public Map<String, String> getUserProperties() {
return userProperties;
}

public boolean hasProfileName() {
return selectedProfile != null && StringUtils.isNotBlank(selectedProfile.getName());
}
Expand Down