From 09073319b15ebcac966ed0a6e5b13468c6957f38 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:37:11 +0200 Subject: [PATCH] fix: stop rejecting java installations over an awt probe --- .../oneclient_java/assets/java/JavaInfo.class | Bin 3231 -> 1355 bytes .../oneclient_java/assets/java/JavaInfo.java | 69 ------------------ packages/oneclient_java/assets/java/README.md | 9 +-- packages/oneclient_java/src/checker.rs | 54 +------------- packages/oneclient_java/src/error.rs | 6 -- 5 files changed, 7 insertions(+), 131 deletions(-) diff --git a/packages/oneclient_java/assets/java/JavaInfo.class b/packages/oneclient_java/assets/java/JavaInfo.class index b4d13ae6de0cde5846a4b18dfe3e49ab1cdf651c..e7b3f9ca9e73a10aebbf9b7597c6ea01b5dcd9e5 100644 GIT binary patch literal 1355 zcma)6O;giQ6g{s=nlufdg^CqWQNe=P3L+{LP)m_-D(N^=T{xkQG}tDcG$8K%C2rWb z5odtW(HS=`-1%>G;m3V#naan)PI_P7efOPv?z!*f+wTvb0SqIfq8)t!oI$^eYZwTS zxh^B7LP8%maRoQ{IH+O>Hx&%46nl$%M)-!?D(>K}j8Pe53K9y&6-+3YlyOhSeTGnS zCY78|O+8DmET>Z|nc0-i(E4;?-PknZMZ;c;>z-@bYhw)lgk@Xa1cMOmd(0pvoxI7= zvS8Wf(ne|3bTh_kkvw9_uxy4i(GyVk#wOh}axWH*ay4E?gs3qD3q~dBl*(4obgL%6QLeX8ND z3C18hm6+k?3Jh8mb<=b!mP5(}>r*@LP^q<)1*b$+DRcFz82$lVUR^hH-XWL%s^Xa? zf?6}ZwCj{j*L%g#8$I5)zT+;E*V!PvaBazQ;%REJN4!m=#2amt%ch-Yxc*;wbxCQX z;yDM!w?$7(TodnbMpCNG^A|~)@JSiz%ydSd9LH-U7R@b-3KFBU{D7V1`fkNN$0=6g z8M36%rbS&ReA26?9ap+>-a6}a4|e^#I)*{IQtfmd867h^WAr9g-#f^5(yWU{Mx)ff z2llQS*hSV~byA0M9vAAN-yuMzHCssRz_&Q?c|sTw!(!JPOb&#_p;0L!?L!##NBm#W zvjg!Xr0gF25os54NFfvPli5XJ7wR@7G4Wbt+kd_^B11u1--ot~rdm|TKAJfvAJGK* zp^}woCQ~U2@ltUGK}@3wGvr&sX;^4Q32nGYk=+pgK!YTsoAE!D`HO!~F46N7><2-q z{HD~)o2HQ~(Xx-0uaL!Uh{D@>;ce9!B%o7u9?hf!h=E3OHj%76R{(-~kI{Fjhlus! sK;2g>j*Ry8rUV|il-zKbDtNXt-4#VW8dPl6 zu?@zi6H_bsf|V1fo3;wWo;z=Og%yE=P51jq+`m;zx7&5Zu!E7h3k*CKDA{iNFb^*9 zc+1Rnsn{j3^WLb=EZEtM3i(zMN7DxA>J zS^`)u+eTeCJ7*W7tYN#3!+4BQ&6xR~teMY$jK^`A!chsvF@Zfz89w>hcfNok`o@FX|$8cvr} zo6Q6|Jvz=xojRF>o13?@vV!$Er{gJ{7f`Han>ia-zP0c%SHF2 z8lCanC37-sX}HK!+&mG@aq$@e$Q;LI`&<%uqROcihn9M-^1RYkEuO`5DkgM153}5c z3k5sdo^;b@mI)~%LqiP82;5bO2tXPc6_$=EOqXr_u*(#$E4WE_$?|&4JUx|LxY9?J zkTlpN#ggqv|8qLB;4skAu2V2=hYW43%(Z96^itO41SzIh@F=a zMDaa*U&Rk}T*nP|x*r{rYk$f!=V$D6zSmi_J=e)u4m+xmz2dW^s&rquaX!YL^r^v* zbo>}UVR_4KNA{QPHrkSH@l$~v8_g<50Snsec`jT1CVr;k=Q@6YUkdD!TFdPP4!L~0 z9Cf@x7Hz+kV>~3dTrNufa|7nQudhN^af^OR+U1%OpYAkg zqJRHJQ|^M7wq&_zFJqNAZ<~w>K6P@x!XFd`&uA^6`Sp%772e$Aj5sG3L@p*{rN909;tvJuUL2SnyKOJ7i z4!p?=@2`mCZ$$DBwAv5lE&&az_@j{j3D|#eTt%9H|AF{7L5|A1G(eB;LVh8(HirzY zh`x0UJ*})ILu)?LIuA~jf-;CZ7)l-Xad$t%Ip812nhdDaipoo~RFhijMyUOg@oD4f zb&TD@Geu1HHyblW%w9(<{4UaCA;U?HDaL#%xr&Zv!=va1^k$>5NoP^&EK41uWc7mF z`CKY_sIu1ajaq-<2Ew5=zl#4-*7})>WZDW|WRNd#l*r#ooST@+A)?rV1X|IBHeR`h z@eGb)o?o2Hc$`*8ITer7vJ+RSA#pwk?E@qT>b7kkpq@y72-U|sMu_kF=n;Pj3+HJG z?0=BBlBz53;L4bB)p&`}+{Txak$1Tc$<0H?E4T3)6ATt#_ZMNg*pM2p`m~#~T!CWM&!s-9AH}B_PjHIzgbGr_?03GXBY&x_v6%I1_-#52w;W=Qa*{^L?nw zDij`6BCMPxZo!0Vm`II;%eQJ2ypC@wM9P_yi>`?<^zAh=Yni>lm ZzfO%sjH{`)q24=%!i?ijw5`FP{|5pM3>g3b diff --git a/packages/oneclient_java/assets/java/JavaInfo.java b/packages/oneclient_java/assets/java/JavaInfo.java index 10d19de5..4d161bb5 100644 --- a/packages/oneclient_java/assets/java/JavaInfo.java +++ b/packages/oneclient_java/assets/java/JavaInfo.java @@ -1,6 +1,3 @@ -import java.io.File; -import java.util.Locale; - public final class JavaInfo { private static final String[] CHECKED_PROPERTIES = new String[] {"os.arch", "java.version", "java.vendor", "java.home"}; @@ -17,77 +14,11 @@ public final class JavaInfo { } } - System.out.println("java.awt=" + hasClass("java.awt.Toolkit")); - System.out.println("java.awt.natives=" + hasAwtNatives()); - System.out.println("java.awt.link=" + awtLinks()); System.out.println("java.jdk=" + hasCompiler()); System.exit(returnCode); } - /** Loads the class without initialising it, so no display is ever needed. */ - private static boolean hasClass(String name) { - try { - Class.forName(name, false, JavaInfo.class.getClassLoader()); - return true; - } catch (Throwable ignored) { - return false; - } - } - - private static boolean hasAwtNatives() { - try { - String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); - String[] required; - - if (os.contains("win")) { - required = new String[] {"awt.dll", "fontmanager.dll"}; - } else if (os.contains("mac") || os.contains("darwin")) { - required = new String[] {"libawt_lwawt.dylib", "libfontmanager.dylib"}; - } else { - required = new String[] {"libawt_xawt.so", "libfontmanager.so"}; - } - - for (String name : required) { - if (!findNative(name)) { - return false; - } - } - - return true; - } catch (Throwable ignored) { - return false; - } - } - - private static boolean findNative(String name) { - File home = new File(System.getProperty("java.home", ".")); - File[] roots = new File[] { - new File(home, "lib"), - new File(home, "bin"), - new File(new File(home, "lib"), System.getProperty("os.arch", "")), - }; - - for (File root : roots) { - if (new File(root, name).isFile()) { - return true; - } - } - - return false; - } - - private static boolean awtLinks() { - try { - java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getClass(); - return true; - } catch (LinkageError broken) { - return false; - } catch (Throwable ignored) { - return true; - } - } - private static boolean hasCompiler() { try { return javax.tools.ToolProvider.getSystemJavaCompiler() != null; diff --git a/packages/oneclient_java/assets/java/README.md b/packages/oneclient_java/assets/java/README.md index eb9180c4..c83c131e 100644 --- a/packages/oneclient_java/assets/java/README.md +++ b/packages/oneclient_java/assets/java/README.md @@ -6,8 +6,7 @@ java.vendor=Azul Systems, Inc. ``` > [!NOTE] -> The checked-in `JavaInfo.class` predates the `java.home`, `java.awt` and `java.jdk` -> lines and does not print them yet. Recompiling it against a Java 8 target -> (`javac --release 8 JavaInfo.java`) is what turns the probe-side answers on; until -> then [`checker.rs`](../../src/checker.rs) falls back to inspecting the installation -> on disk, which reaches the same verdict for every image seen in the wild. +> `JavaInfo.class` is checked in rather than built, so recompile it against a Java 8 +> target (`javac -source 8 -target 8 JavaInfo.java`) whenever the source changes, +> and commit both files together. [`checker.rs`](../../src/checker.rs) reads only the +> `key=value` lines it prints. diff --git a/packages/oneclient_java/src/checker.rs b/packages/oneclient_java/src/checker.rs index 3f2829d7..844205f1 100644 --- a/packages/oneclient_java/src/checker.rs +++ b/packages/oneclient_java/src/checker.rs @@ -68,18 +68,6 @@ pub async fn check_java_runtime(absolute_path: String) -> JavaResult JavaResult) -> bool { - probe_flag(info, "java.awt") - && probe_flag(info, "java.awt.natives") - && probe_flag(info, "java.awt.link") -} - fn probe_flag(info: &HashMap, key: &str) -> bool { info.get(key) .is_some_and(|value| value.eq_ignore_ascii_case("true")) @@ -136,42 +118,12 @@ mod tests { #[test] fn a_flag_the_probe_never_printed_is_false() { - assert!(!probe_flag(&info(&[]), "java.awt")); + assert!(!probe_flag(&info(&[]), "java.jdk")); } #[test] fn a_flag_is_read_regardless_of_case() { - assert!(probe_flag(&info(&[("java.awt", "TRUE")]), "java.awt")); - assert!(!probe_flag(&info(&[("java.awt", "false")]), "java.awt")); - } - - fn awt(classes: &str, natives: &str, link: &str) -> HashMap { - info(&[ - ("java.awt", classes), - ("java.awt.natives", natives), - ("java.awt.link", link), - ]) - } - - #[test] - fn a_complete_image_is_usable() { - assert!(has_usable_awt(&awt("true", "true", "true"))); - } - - #[test] - fn awt_classes_without_their_natives_are_not_usable() { - assert!(!has_usable_awt(&awt("true", "false", "true"))); - } - - #[test] - fn natives_that_refuse_to_link_are_not_usable() { - assert!(!has_usable_awt(&awt("true", "true", "false"))); - } - - #[test] - fn every_half_is_required() { - assert!(!has_usable_awt(&info(&[("java.awt", "true")]))); - assert!(!has_usable_awt(&info(&[("java.awt.natives", "true")]))); - assert!(!has_usable_awt(&info(&[("java.awt.link", "true")]))); + assert!(probe_flag(&info(&[("java.jdk", "TRUE")]), "java.jdk")); + assert!(!probe_flag(&info(&[("java.jdk", "false")]), "java.jdk")); } } diff --git a/packages/oneclient_java/src/error.rs b/packages/oneclient_java/src/error.rs index a26affa6..cb1c1afc 100644 --- a/packages/oneclient_java/src/error.rs +++ b/packages/oneclient_java/src/error.rs @@ -41,11 +41,6 @@ pub enum JavaError { #[error("selected path is not a valid java installation: {path}")] InvalidJavaPath { path: String }, - #[error( - "java installation at '{path}' has no usable java.awt (the java.desktop module or its native libraries are missing)" - )] - MissingAwtSupport { path: String }, - #[error("selected java is version {found}, but version {expected} is required")] VersionMismatch { expected: u32, found: u32 }, @@ -68,7 +63,6 @@ impl JavaError { matches!( self, JavaError::InvalidJavaPath { .. } - | JavaError::MissingAwtSupport { .. } | JavaError::ParseVersion { .. } ) }