From f7163ceb319d3972f23eb208bc2e4892c78bf924 Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Tue, 9 Apr 2024 13:37:55 +0700 Subject: [PATCH] Fix[init]: unexpectedly preload LWJGL Migrating token storage to keychain accidentally causes LWJGL to be preloaded, making Fabric fails to init. Add JNI library PojavAccountJNI to do the task of sending access token from keychain to JVM space. --- .../kdt/pojavlaunch/value/MinecraftAccount.java | 2 +- Natives/CMakeLists.txt | 6 ++++++ Natives/authenticator/MicrosoftAuthenticator.m | 14 -------------- Natives/authenticator/MinecraftAccountJNI.m | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 Natives/authenticator/MinecraftAccountJNI.m diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java index 559db0de..c011b21a 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/value/MinecraftAccount.java @@ -44,7 +44,7 @@ public class MinecraftAccount } static { - System.load(System.getenv("BUNDLE_PATH") + "/PojavLauncher"); + System.loadLibrary("PojavAccountJNI"); } public static native String getAccessTokenFromKeychain(String xuid); } diff --git a/Natives/CMakeLists.txt b/Natives/CMakeLists.txt index c036a8da..43e29610 100644 --- a/Natives/CMakeLists.txt +++ b/Natives/CMakeLists.txt @@ -90,6 +90,12 @@ target_link_libraries(AFNetworking "-framework UIKit" ) +# MinecraftAccount JNI +add_library(PojavAccountJNI SHARED + authenticator/MinecraftAccountJNI.m +) +target_link_libraries(PojavAccountJNI) + # PojavLauncher add_executable(PojavLauncher dyld_bypass_validation.m diff --git a/Natives/authenticator/MicrosoftAuthenticator.m b/Natives/authenticator/MicrosoftAuthenticator.m index cc2d041d..fefba00d 100644 --- a/Natives/authenticator/MicrosoftAuthenticator.m +++ b/Natives/authenticator/MicrosoftAuthenticator.m @@ -289,17 +289,3 @@ typedef void(^XSTSCallback)(NSString *xsts, NSString *uhs); } @end - -JNIEXPORT jstring JNICALL Java_net_kdt_pojavlaunch_value_MinecraftAccount_getAccessTokenFromKeychain(JNIEnv *env, jclass clazz, jstring xuid) { - // This function should only be called once - static BOOL called = NO; - if (called) { - abort(); - } - called = YES; - - const char *xuidC = (*env)->GetStringUTFChars(env, xuid, 0); - NSString *accessToken = [MicrosoftAuthenticator tokenDataOfProfile:@(xuidC)][@"accessToken"]; - (*env)->ReleaseStringUTFChars(env, xuid, xuidC); - return (*env)->NewStringUTF(env, accessToken.UTF8String); -} diff --git a/Natives/authenticator/MinecraftAccountJNI.m b/Natives/authenticator/MinecraftAccountJNI.m new file mode 100644 index 00000000..16c3947b --- /dev/null +++ b/Natives/authenticator/MinecraftAccountJNI.m @@ -0,0 +1,16 @@ +#import "BaseAuthenticator.h" +#include "jni.h" + +JNIEXPORT jstring JNICALL Java_net_kdt_pojavlaunch_value_MinecraftAccount_getAccessTokenFromKeychain(JNIEnv *env, jclass clazz, jstring xuid) { + // This function should only be called once + static BOOL called = NO; + if (called) { + abort(); + } + called = YES; + + const char *xuidC = (*env)->GetStringUTFChars(env, xuid, 0); + NSString *accessToken = [NSClassFromString(@"MicrosoftAuthenticator") tokenDataOfProfile:@(xuidC)][@"accessToken"]; + (*env)->ReleaseStringUTFChars(env, xuid, xuidC); + return (*env)->NewStringUTF(env, accessToken.UTF8String); +}