diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java index 59d78879901..6e95234f039 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java @@ -92,7 +92,7 @@ static AuthlibInjectorAccount fromStorage( Map properties = JsonUtils.GSON.fromJson( profilePropertiesObject, JsonUtils.mapTypeOf(String.class, String.class)); - GameProfile selected = session.getSelectedProfile(); + GameProfile selected = session.selectedProfile(); ObservableOptionalCache profileRepository = server.getYggdrasilService().getProfileRepository(); profileRepository.put(selected.getId(), new CompleteGameProfile(selected, properties)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index d178b6951f0..2a7ab16c8a6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -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(); @@ -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(); @@ -93,23 +93,23 @@ 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); @@ -117,8 +117,8 @@ public synchronized AuthInfo logIn() throws AuthenticationException { 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()) { @@ -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; @@ -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() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java index 540ba623d70..7e3acb0ea8f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java @@ -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"); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java index 68d46caff96..2eea0e221b6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java @@ -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 availableProfiles; - - @Nullable - private final Map userProperties; - - public YggdrasilSession(String clientToken, String accessToken, GameProfile selectedProfile, List availableProfiles, Map 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 availableProfiles, @Nullable Map 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 getAvailableProfiles() { - return availableProfiles; - } - - public Map getUserProperties() { - return userProperties; - } - public boolean hasProfileName() { return selectedProfile != null && StringUtils.isNotBlank(selectedProfile.getName()); }