From 5a81972f68e64cbaaea8599dae8f0eb461c6fb43 Mon Sep 17 00:00:00 2001 From: Haowei Wen Date: Thu, 27 Aug 2020 02:44:12 +0800 Subject: [PATCH] impl https://github.com/yushijinhun/authlib-injector/issues/85 --- .../hmcl/ui/account/AddAccountPane.java | 22 +++++++++++++++---- .../AuthlibInjectorServer.java | 8 +++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAccountPane.java index 44389c7d8..0175791d9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAccountPane.java @@ -114,7 +114,7 @@ public class AddAccountPane extends StackPane { cboServers.visibleProperty().bind(loginType.isEqualTo(Accounts.FACTORY_AUTHLIB_INJECTOR)); lblInjectorServer.visibleProperty().bind(cboServers.visibleProperty()); - txtUsername.getValidators().add(new Validator(i18n("input.email"), str -> !txtPassword.isVisible() || str.contains("@"))); + txtUsername.getValidators().add(new Validator(i18n("input.email"), this::validateUsername)); btnAccept.disableProperty().bind(Bindings.createBooleanBinding( () -> !( // consider the opposite situation: input is valid @@ -123,9 +123,9 @@ public class AddAccountPane extends StackPane { (!txtPassword.isVisible() || txtPassword.validate()) && (!cboServers.isVisible() || cboServers.getSelectionModel().getSelectedItem() != null) ), - txtUsername.textProperty(), - txtPassword.textProperty(), txtPassword.visibleProperty(), - cboServers.getSelectionModel().selectedItemProperty(), cboServers.visibleProperty())); + txtUsername.textProperty(), txtPassword.textProperty(), + loginType, cboServers.getSelectionModel().selectedItemProperty(), + txtPassword.visibleProperty(), cboServers.visibleProperty())); // authlib-injector links links.bind(BindingMapping.of(cboServers.getSelectionModel().selectedItemProperty()) @@ -135,6 +135,20 @@ public class AddAccountPane extends StackPane { linksContainer.visibleProperty().bind(cboServers.visibleProperty()); } + private boolean validateUsername(String username) { + AccountFactory loginType = cboType.getSelectionModel().getSelectedItem(); + if (loginType == Accounts.FACTORY_OFFLINE) { + return true; + } else if (loginType == Accounts.FACTORY_AUTHLIB_INJECTOR) { + AuthlibInjectorServer server = cboServers.getSelectionModel().getSelectedItem(); + if (server != null && server.isNonEmailLogin()) { + return true; + } + } + + return username.contains("@"); + } + private static final String[] ALLOWED_LINKS = { "register" }; public static List createHyperlinks(AuthlibInjectorServer server) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java index bd72cc9bd..282c22599 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java @@ -110,6 +110,7 @@ public class AuthlibInjectorServer implements Observable { @Nullable private transient String name; private transient Map links = emptyMap(); + private transient boolean nonEmailLogin; private transient boolean metadataRefreshed; private final transient ObservableHelper helper = new ObservableHelper(this); @@ -145,6 +146,10 @@ public class AuthlibInjectorServer implements Observable { return links; } + public boolean isNonEmailLogin() { + return nonEmailLogin; + } + public String fetchMetadataResponse() throws IOException { if (metadataResponse == null || !metadataRefreshed) { refreshMetadata(); @@ -194,6 +199,9 @@ public class AuthlibInjectorServer implements Observable { return converted; }) .orElse(emptyMap()); + this.nonEmailLogin = metaObject.flatMap(meta -> tryCast(meta.get("feature.non_email_login"), JsonPrimitive.class)) + .map(it -> it.getAsBoolean()) + .orElse(false); } }