From 6a7f01289b7dbd99584f0725ddadc990db9f0428 Mon Sep 17 00:00:00 2001 From: Daniel Arroyo Date: Fri, 14 Aug 2026 22:16:36 -0400 Subject: [PATCH] fix(auth): move SecureRandom out of static field for native-image compat GraalVM native-image rejects static fields of type Random/SecureRandom (their internal state is captured at build time and can't be replayed deterministically). Move the instance into generatePassword() as a local variable - it is only used once at startup anyway. --- src/main/java/com/l2/shots/auth/BootstrapAdmin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java index 92aa9fc..37b5e07 100644 --- a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java +++ b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java @@ -21,7 +21,6 @@ import java.security.SecureRandom; public class BootstrapAdmin { private static final Logger LOG = Logger.getLogger(BootstrapAdmin.class); - private static final SecureRandom RANDOM = new SecureRandom(); // Alfabeto sin chars ambiguos (0/o/O, 1/l/I) para no cansar al tipear. private static final char[] ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz".toCharArray(); @@ -61,9 +60,12 @@ public class BootstrapAdmin { } private static String generatePassword() { + // Local para evitar un campo estático (GraalVM native-image no permite + // instancias de Random/SecureRandom en el image heap; las crea en runtime). + SecureRandom random = new SecureRandom(); StringBuilder sb = new StringBuilder(PASSWORD_LENGTH); for (int i = 0; i < PASSWORD_LENGTH; i++) { - sb.append(ALPHABET[RANDOM.nextInt(ALPHABET.length)]); + sb.append(ALPHABET[random.nextInt(ALPHABET.length)]); } return sb.toString(); }