From 5f40d01fb45208aca304bf5af6c79139cbdfa9ac Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 16 Jun 2018 20:39:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8AuthlibInjectorAccountFactory=E4=B8=AD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8AuthlibInjectorServer=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AFurl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/setting/Accounts.java | 26 ++++++++++++++++- .../org/jackhuang/hmcl/setting/Settings.java | 28 ------------------- .../AuthlibInjectorAccountFactory.java | 26 +++++++++++------ 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 2cd40af11..b946d0934 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -23,6 +23,7 @@ import org.jackhuang.hmcl.auth.AccountFactory; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccountFactory; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorBuildInfo; +import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServerResponse; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.auth.offline.OfflineAccountFactory; @@ -41,8 +42,10 @@ import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.mapOf; +import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.Pair.pair; /** @@ -58,7 +61,7 @@ public final class Accounts { public static final Map> ACCOUNT_FACTORY = mapOf( pair(OFFLINE_ACCOUNT_KEY, OfflineAccountFactory.INSTANCE), pair(YGGDRASIL_ACCOUNT_KEY, new YggdrasilAccountFactory(MojangYggdrasilProvider.INSTANCE)), - pair(AUTHLIB_INJECTOR_ACCOUNT_KEY, new AuthlibInjectorAccountFactory(Accounts::downloadAuthlibInjector)) + pair(AUTHLIB_INJECTOR_ACCOUNT_KEY, new AuthlibInjectorAccountFactory(Accounts::downloadAuthlibInjector, Accounts::getOrCreateAuthlibInjectorServer)) ); private static final Map AUTHLIB_INJECTOR_SERVER_NAMES = new HashMap<>(); @@ -104,7 +107,28 @@ public final class Accounts { } } + @Deprecated public static TaskResult getAuthlibInjectorServerNameAsync(AuthlibInjectorAccount account) { return Task.ofResult("serverName", () -> Accounts.getAuthlibInjectorServerName(account.getServerBaseURL())); } + + private static AuthlibInjectorServer getOrCreateAuthlibInjectorServer(String url) { + return Settings.SETTINGS.authlibInjectorServers.stream() + .filter(server -> url.equals(server.getUrl())) + .findFirst() + .orElseGet(() -> { + // this usually happens when migrating data from an older version + String name; + try { + name = Accounts.getAuthlibInjectorServerName(url); + LOG.info("Migrated authlib injector server [" + url + "], name=[" + name + "]"); + } catch (Exception e) { + name = url; + LOG.log(Level.WARNING, "Failed to migrate authlib injector server [" + url + "]", e); + } + AuthlibInjectorServer server = new AuthlibInjectorServer(url, name); + Settings.SETTINGS.authlibInjectorServers.add(server); + return server; + }); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 279d945c4..9ef5b6973 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -104,8 +104,6 @@ public class Settings { accounts.put(Accounts.getAccountId(account), account); } - migrateAuthlibInjectorServers(); - SETTINGS.authlibInjectorServers.addListener(onInvalidating(this::removeDanglingAuthlibInjectorAccounts)); checkProfileMap(); @@ -317,32 +315,6 @@ public class Settings { .collect(toSet()); } - /** - * The {@code serverBaseURL} specified in {@link AuthlibInjectorAccount} may not have an associated - * {@link AuthlibInjectorServer} in {@link Config#authlibInjectorServers}, - * which usually happens when migrating data from an older version. - * This method adds the missing servers to {@link Config#authlibInjectorServers}. - */ - private void migrateAuthlibInjectorServers() { - Set existentServerUrls = getAuthlibInjectorServerUrls(); - accounts.values().stream() - .filter(AuthlibInjectorAccount.class::isInstance) - .map(it -> ((AuthlibInjectorAccount) it).getServerBaseURL()) - .distinct() - .filter(it -> !existentServerUrls.contains(it)) - .forEach(url -> { - String serverName; - try { - serverName = Accounts.getAuthlibInjectorServerName(url); - Logging.LOG.info("Migrated authlib injector server [" + url + "], name=[" + serverName + "]"); - } catch (Exception e) { - serverName = url; - Logging.LOG.log(Level.WARNING, "Failed to migrate authlib injector server [" + url + "]", e); - } - SETTINGS.authlibInjectorServers.add(new AuthlibInjectorServer(url, serverName)); - }); - } - /** * After an {@link AuthlibInjectorServer} is removed, the associated accounts should also be removed. * This method performs a check and removes the dangling accounts. 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 51d642f72..8a4228987 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 @@ -11,28 +11,36 @@ import org.jackhuang.hmcl.util.NetworkUtils; import java.net.Proxy; import java.util.Map; import java.util.Objects; +import java.util.function.Function; import static org.jackhuang.hmcl.util.Lang.tryCast; public class AuthlibInjectorAccountFactory extends AccountFactory { private final ExceptionalSupplier injectorJarPathSupplier; + private Function serverLookup; - public AuthlibInjectorAccountFactory(ExceptionalSupplier injectorJarPathSupplier) { + /** + * @param serverLookup a function that looks up {@link AuthlibInjectorServer} by url + */ + public AuthlibInjectorAccountFactory(ExceptionalSupplier injectorJarPathSupplier, Function serverLookup) { this.injectorJarPathSupplier = injectorJarPathSupplier; + this.serverLookup = serverLookup; } @Override - public AuthlibInjectorAccount create(CharacterSelector selector, String username, String password, Object serverBaseURL, Proxy proxy) throws AuthenticationException { + public AuthlibInjectorAccount create(CharacterSelector selector, String username, String password, Object apiRoot, Proxy proxy) throws AuthenticationException { Objects.requireNonNull(selector); Objects.requireNonNull(username); Objects.requireNonNull(password); Objects.requireNonNull(proxy); - if (!(serverBaseURL instanceof String) || !NetworkUtils.isURL((String) serverBaseURL)) - throw new IllegalArgumentException("Additional data should be server base url string for authlib injector accounts."); + if (!(apiRoot instanceof String) || !NetworkUtils.isURL((String) apiRoot)) + throw new IllegalArgumentException("Additional data should be API root string for authlib injector accounts."); - AuthlibInjectorAccount account = new AuthlibInjectorAccount(new YggdrasilService(new AuthlibInjectorProvider((String) serverBaseURL), proxy), - (String) serverBaseURL, injectorJarPathSupplier, username, null, null); + AuthlibInjectorServer server = serverLookup.apply((String) apiRoot); + + AuthlibInjectorAccount account = new AuthlibInjectorAccount(new YggdrasilService(new AuthlibInjectorProvider(server.getUrl()), proxy), + server.getUrl(), injectorJarPathSupplier, username, null, null); account.logInWithPassword(password, selector); return account; } @@ -49,7 +57,9 @@ public class AuthlibInjectorAccountFactory extends AccountFactory new IllegalArgumentException("storage does not have API root.")); - return new AuthlibInjectorAccount(new YggdrasilService(new AuthlibInjectorProvider(apiRoot), proxy), - apiRoot, injectorJarPathSupplier, username, session.getSelectedProfile().getId(), session); + AuthlibInjectorServer server = serverLookup.apply(apiRoot); + + return new AuthlibInjectorAccount(new YggdrasilService(new AuthlibInjectorProvider(server.getUrl()), proxy), + server.getUrl(), injectorJarPathSupplier, username, session.getSelectedProfile().getId(), session); } }