Skip to content
Open
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 @@ -21,7 +21,6 @@
import javafx.stage.Stage;
import org.jackhuang.hmcl.Launcher;
import org.jackhuang.hmcl.auth.*;
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDownloadException;
import org.jackhuang.hmcl.auth.offline.OfflineAccount;
import org.jackhuang.hmcl.download.DefaultDependencyManager;
import org.jackhuang.hmcl.download.DownloadProvider;
Expand Down Expand Up @@ -301,8 +300,6 @@ public void onStop(boolean success, TaskExecutor executor) {
}
} else if (ex instanceof GameAssetIndexDownloadTask.GameAssetIndexMalformedException) {
message = i18n("assets.index.malformed");
} else if (ex instanceof AuthlibInjectorDownloadException) {
message = i18n("account.failed.injector_download_failure");
} else if (ex instanceof CharacterDeletedException) {
message = i18n("account.failed.character_deleted");
} else if (ex instanceof ResponseCodeException) {
Expand Down
59 changes: 43 additions & 16 deletions HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,21 @@
import org.jackhuang.hmcl.game.OAuthServer;
import org.jackhuang.hmcl.task.Schedulers;
import org.jackhuang.hmcl.util.FileSaver;
import org.jackhuang.hmcl.util.io.FileUtils;
import org.jackhuang.hmcl.util.io.JarUtils;
import org.jackhuang.hmcl.util.skin.InvalidSkinException;

import javax.net.ssl.SSLException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.UncheckedIOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.function.Supplier;

import static java.util.stream.Collectors.toList;
import static javafx.collections.FXCollections.observableArrayList;
Expand All @@ -67,12 +72,12 @@ public final class Accounts {
private Accounts() {
}

private static final AuthlibInjectorArtifactProvider AUTHLIB_INJECTOR_DOWNLOADER = createAuthlibInjectorArtifactProvider();
private static final Supplier<Path> AUTHLIB_INJECTOR_ARTIFACT_PROVIDER = Accounts::resolveAuthlibInjectorArtifact;

public static final OAuthServer.Factory OAUTH_CALLBACK = new OAuthServer.Factory();

public static final OfflineAccountFactory FACTORY_OFFLINE = new OfflineAccountFactory(AUTHLIB_INJECTOR_DOWNLOADER);
public static final AuthlibInjectorAccountFactory FACTORY_AUTHLIB_INJECTOR = new AuthlibInjectorAccountFactory(AUTHLIB_INJECTOR_DOWNLOADER, Accounts::getOrCreateAuthlibInjectorServer);
public static final OfflineAccountFactory FACTORY_OFFLINE = new OfflineAccountFactory(AUTHLIB_INJECTOR_ARTIFACT_PROVIDER);
public static final AuthlibInjectorAccountFactory FACTORY_AUTHLIB_INJECTOR = new AuthlibInjectorAccountFactory(AUTHLIB_INJECTOR_ARTIFACT_PROVIDER, Accounts::getOrCreateAuthlibInjectorServer);
public static final MicrosoftAccountFactory FACTORY_MICROSOFT = new MicrosoftAccountFactory(new MicrosoftService(OAUTH_CALLBACK));
public static final List<AccountFactory<?>> FACTORIES = immutableListOf(FACTORY_OFFLINE, FACTORY_MICROSOFT, FACTORY_AUTHLIB_INJECTOR);

Expand Down Expand Up @@ -105,7 +110,7 @@ public static AccountFactory<?> getAccountFactory(String loginType) {
}

public static BoundAuthlibInjectorAccountFactory getAccountFactoryByAuthlibInjectorServer(AuthlibInjectorServer server) {
return new BoundAuthlibInjectorAccountFactory(AUTHLIB_INJECTOR_DOWNLOADER, server);
return new BoundAuthlibInjectorAccountFactory(AUTHLIB_INJECTOR_ARTIFACT_PROVIDER, server);
}
// ====

Expand Down Expand Up @@ -356,20 +361,44 @@ public static ObjectProperty<Account> selectedAccountProperty() {
}

// ==== authlib-injector ====
private static AuthlibInjectorArtifactProvider createAuthlibInjectorArtifactProvider() {
String authlibinjectorLocation = System.getProperty("hmcl.authlibinjector.location");
if (authlibinjectorLocation != null) {
LOG.info("Using specified authlib-injector: " + authlibinjectorLocation);
return new SimpleAuthlibInjectorArtifactProvider(Paths.get(authlibinjectorLocation));
private static Path resolveAuthlibInjectorArtifact() {
// 1. Use hmcl.authlibinjector.location if specified
String overrideSetting = System.getProperty("hmcl.authlibinjector.location");
if (overrideSetting != null) {
LOG.info("Using specified authlib-injector: " + overrideSetting);
return Paths.get(overrideSetting);
}

String authlibInjectorVersion = JarUtils.getAttribute("hmcl.authlib-injector.version", null);
if (authlibInjectorVersion == null)
// 2. Use bundled authlib-injector
String version = JarUtils.getAttribute("hmcl.authlib-injector.version", null);
if (version == null)
throw new AssertionError("Missing hmcl.authlib-injector.version");

String authlibInjectorFileName = "authlib-injector-" + authlibInjectorVersion + ".jar";
return new AuthlibInjectorExtractor(Accounts.class.getResource("/assets/" + authlibInjectorFileName),
Metadata.DEPENDENCIES_DIRECTORY.resolve("universal").resolve(authlibInjectorFileName));
String filename = "authlib-injector-" + version + ".jar";
Path extractDir = Metadata.DEPENDENCIES_DIRECTORY.resolve("universal");
Path extractedPath = extractDir.resolve(filename);

if (Files.isRegularFile(extractedPath)) {
// Reuse extracted file
LOG.info("Using existing authlib-injector: " + extractedPath);
return extractedPath;
}

// Extract bundled authlib-injector
URL bundledResource = Accounts.class.getResource("/assets/" + filename);
if (bundledResource == null)
throw new AssertionError("Missing bundled authlib-injector: " + filename);

LOG.info("Extracting bundled authlib-injector to: " + extractedPath);
try {
Files.createDirectories(extractDir);
try (InputStream inputStream = bundledResource.openStream()) {
FileUtils.saveSafely(extractedPath, inputStream::transferTo);
}
} catch (IOException e) {
throw new UncheckedIOException("Failed to extract bundled authlib-injector", e);
}
return extractedPath;
}

private static AuthlibInjectorServer getOrCreateAuthlibInjectorServer(String url) {
Expand Down Expand Up @@ -441,8 +470,6 @@ public static String localizeErrorMessage(Exception exception) {
}
}
return exception.getMessage();
} else if (exception instanceof AuthlibInjectorDownloadException) {
return i18n("account.failed.injector_download_failure");
} else if (exception instanceof CharacterDeletedException) {
return i18n("account.failed.character_deleted");
} else if (exception instanceof InvalidSkinException) {
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N.properties
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ account.failed=Failed to refresh account.
account.failed.character_deleted=The player has already been deleted.
account.failed.connect_authentication_server=Failed to connect to the authentication server, your network connection may be down.
account.failed.connect_injector_server=Failed to connect to the authentication server. Please check your network and make sure you entered the correct URL.
account.failed.injector_download_failure=Failed to download the authlib-injector. Please check your network, or try switching to a different download source.
account.failed.invalid_credentials=Incorrect password or rate limited. Please try again later.
account.failed.invalid_password=Invalid password.
account.failed.invalid_token=Please try logging in again.
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_ar.properties
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ account.failed=فشل تحديث الحساب.
account.failed.character_deleted=تم حذف اللاعب بالفعل.
account.failed.connect_authentication_server=فشل الاتصال بخادم المصادقة، قد يكون اتصال الشبكة معطلاً.
account.failed.connect_injector_server=فشل الاتصال بخادم المصادقة. يرجى التحقق من شبكتك والتأكد من إدخال عنوان URL الصحيح.
account.failed.injector_download_failure=فشل تنزيل authlib-injector. يرجى التحقق من شبكتك، أو محاولة التبديل إلى مصدر تنزيل مختلف.
account.failed.invalid_credentials=كلمة مرور غير صحيحة أو تم تجاوز الحد المسموح. يرجى المحاولة مرة أخرى لاحقاً.
account.failed.invalid_password=كلمة مرور غير صالحة.
account.failed.invalid_token=يرجى المحاولة بتسجيل الدخول مرة أخرى.
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ account.failed=Error al actualizar la cuenta.
account.failed.character_deleted=El jugador ya ha sido eliminado.
account.failed.connect_authentication_server=No se ha podido conectar con el servidor de autenticación. Es posible que su conexión de red no funcione.
account.failed.connect_injector_server=No se ha podido conectar con el servidor de autenticación. Por favor, comprueba su red y asegúrate de que has introducido la URL correcta.
account.failed.injector_download_failure=No se ha podido descargar authlib-injector. Por favor, compruebe su red, o intente cambiar a un espejo de descarga diferente.
account.failed.invalid_credentials=Contraseña incorrecta o tasa limitada, por favor, inténtelo más tarde.
account.failed.invalid_password=Contraseña no válida.
account.failed.invalid_token=Por favor, intente iniciar sesión de nuevo.
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_ja.properties
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ account.failed=ログインに失敗しました
account.failed.character_deleted=キャラクターが削除されました。
account.failed.connect_authentication_server=認証サーバーに接続できません。インターネット接続を確認してください。
account.failed.connect_injector_server=認証サーバーに接続できません。ネットワークをチェックして、URLが正しいことを確認してください。
account.failed.injector_download_failure=authlib-injectorのダウンロードに失敗しました。ネットワークを確認して、別のダウンロードソースに切り替えてみてください。
account.failed.invalid_credentials=パスワードが正しくないか、一時的にログインできません。
account.failed.invalid_password=無効なパスワード
account.failed.invalid_token=ログアウトし、パスワードを再入力してログインしてください。
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_lzh.properties
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ account.failed=弗能新戶簿
account.failed.character_deleted=此角除訖
account.failed.connect_authentication_server=不可連所證之伺服器也,容有網謬。望查械之訪抑以代待也。\n君可求助於右上之鈕。
account.failed.connect_injector_server=不可連所證之伺服器也,容有網謬。望查械之訪與 URL 之入,抑以代待也。\n君可求助於右上之鈕。
account.failed.injector_download_failure=無可引 authlin-injector,容有網謬。望查械之訪、試更所引之源,抑以代待也。\n君可求助於右上之鈕。
account.failed.invalid_credentials=君戶簿名、符節者有謬焉,抑入蕃而爲暫禁矣。待而復試也。
account.failed.invalid_password=無效符節
account.failed.invalid_token=望試出籍而復示符節以入
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_ru.properties
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ account.failed=Не удалось обновить аккаунт.
account.failed.character_deleted=Игрок уже был удален.
account.failed.connect_authentication_server=Не удалось связаться с серверами авторизации, проверьте свой интернет.
account.failed.connect_injector_server=Не удалось подключиться к серверу авторизации. Проверьте свой интернет и убедитесь, что вы ввели правильный URL-адрес.
account.failed.injector_download_failure=Не удалось скачать authlib-injector. Проверьте свой интернет или попробуйте переключиться на другое зеркало скачивания.
account.failed.invalid_credentials=Неверный пароль или ограничена скорость, повторите попытку позже.
account.failed.invalid_password=Неверный пароль
account.failed.invalid_token=Попробуйте выйти из аккаунта и повторно войти.
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_uk.properties
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ account.failed=Не вдалося оновити обліковий запис.
account.failed.character_deleted=Гравця вже видалено.
account.failed.connect_authentication_server=Не вдалося підключитися до сервера автентифікації, можливо, ваше мережеве з'єднання перервано.
account.failed.connect_injector_server=Не вдалося підключитися до сервера автентифікації. Перевірте мережу та переконайтеся, що ви ввели правильну URL-адресу.
account.failed.injector_download_failure=Не вдалося завантажити authlib-injector. Перевірте мережу або спробуйте переключитися на інше джерело завантаження.
account.failed.invalid_credentials=Неправильний пароль або перевищено ліміт запитів. Спробуйте пізніше.
account.failed.invalid_password=Недійсний пароль.
account.failed.invalid_token=Спробуйте увійти знову.
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_zh.properties
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ account.failed=帳戶重新整理失敗
account.failed.character_deleted=已刪除此角色
account.failed.connect_authentication_server=無法連線至認證伺服器。可能是網路問題,請檢查裝置能否正常上網或使用代理服務。
account.failed.connect_injector_server=無法連線至認證伺服器。可能是網路故障,請檢查裝置能否正常上網、檢查網址是否輸入錯誤或使用代理服務。
account.failed.injector_download_failure=無法下載 authlib-injector。請檢查網路或嘗試切換下載來源。
account.failed.invalid_credentials=你的使用者名稱或密碼錯誤,或者登入次數過多被暫時禁止登入。請稍後再試。
account.failed.invalid_password=密碼無效
account.failed.invalid_token=請嘗試登出並重新輸入密碼登入。
Expand Down
1 change: 0 additions & 1 deletion HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ account.failed=账户刷新失败
account.failed.character_deleted=此角色已被删除
account.failed.connect_authentication_server=无法连接认证服务器。可能是网络问题,请检查设备能否正常上网或使用代理服务。\n你可以点击右上角帮助按钮进行求助。
account.failed.connect_injector_server=无法连接认证服务器。可能是网络问题,请检查设备是否能正常上网、URL 是否输入错误,或使用代理服务。\n你可以点击右上角帮助按钮进行求助。
account.failed.injector_download_failure=无法下载 authlib-injector。可能是网络问题,请检查设备是否能正常上网、尝试切换下载源或使用代理服务。\n你可以点击右上角帮助按钮进行求助。
account.failed.invalid_credentials=你的用户名或密码错误,或登录次数过多被暂时禁止登录。请稍后再试。
account.failed.invalid_password=无效的密码
account.failed.invalid_token=请尝试登出并重新输入密码登录
Expand Down
Loading