1010import java .io .OutputStream ;
1111import java .io .PrintStream ;
1212import java .nio .file .Files ;
13+ import java .nio .file .Path ;
14+ import java .nio .file .Paths ;
1315import java .security .KeyManagementException ;
1416import java .security .KeyStoreException ;
1517import java .security .NoSuchAlgorithmException ;
1618import java .security .UnrecoverableKeyException ;
1719import java .security .cert .CertificateException ;
1820import java .security .spec .InvalidKeySpecException ;
1921import java .time .OffsetDateTime ;
22+ import java .util .Arrays ;
2023import java .util .Collection ;
2124import java .util .Map ;
2225import java .util .Optional ;
@@ -54,12 +57,19 @@ public abstract class BaseMain {
5457 static {
5558 try {
5659 Map <String , String > env = System .getenv ();
57- String loggingLevel = env .get ("JAVA_LOGGING_LEVEL" );
60+ final String loggingLevel = env .get ("JAVA_LOGGING_LEVEL" );
61+ Level level = Level .WARNING ;
5862 if (loggingLevel != null ) {
59- Level level = Level .parse (loggingLevel );
63+
64+ if (Arrays .stream (new String []{"OFF" , "SEVERE" , "WARNING" , "INFO" , "CONFIG" , "FINE" , "FINER" , "FINEST" , "ALL" })
65+ .anyMatch (l -> l .equals (loggingLevel ))) {
66+ level = Level .parse (loggingLevel );
67+ } else {
68+ System .err .println ("Invalid JAVA_LOGGING_LEVEL='" + loggingLevel + "', using WARNING" );
69+ }
6070
6171 Logger rootLogger = Logger .getLogger ("" );
62- rootLogger .setLevel (Level . WARNING );
72+ rootLogger .setLevel (level );
6373
6474 // Console Handler
6575 ConsoleHandler consoleHandler = new ConsoleHandler ();
@@ -68,26 +78,43 @@ public abstract class BaseMain {
6878 rootLogger .addHandler (consoleHandler );
6979
7080 String logDir = env .get ("OPERATOR_LOGDIR" );
71- if (logDir != null ) {
81+ if (logDir != null && !( logDir = logDir . trim ()). isEmpty () ) {
7282 Files .createDirectories (PathSupport .getPath (new File (logDir )));
73-
83+ Path logPath = Paths . get ( logDir ). normalize ();
7484 // File handler
75- String pattern = logDir + "/operator%g.log" ;
76- int limit = Integer .parseInt (env .getOrDefault ("JAVA_LOGGING_MAXSIZE" , "20000000" ));
77- int count = Integer .parseInt (env .getOrDefault ("JAVA_LOGGING_COUNT" , "10" ));
78- FileHandler fileHandler = new FileHandler (pattern , limit , count );
79- fileHandler .setLevel (level );
80- fileHandler .setFormatter (new oracle .kubernetes .operator .logging .OperatorLoggingFormatter ());
81- rootLogger .addHandler (fileHandler );
85+ if (logPath .startsWith (".." ) || logPath .toString ().contains ("/../" )) {
86+ System .err .println ("Invalid OPERATOR_LOGDIR (path traversal attempt): " + logDir );
87+ } else {
88+ int limit = getIntegerOrDefault (env .getOrDefault ("JAVA_LOGGING_MAXSIZE" , "20000000" ), 20_000_000 );
89+ int count = getIntegerOrDefault (env .getOrDefault ("JAVA_LOGGING_COUNT" , "10" ), 10 );
90+
91+ limit = Math .min (limit , 100_000_000 );
92+ count = Math .min (count , 100 );
93+
94+ FileHandler fileHandler = new FileHandler (logPath .resolve ("operator%g.log" ).toString (), limit , count , true );
95+ fileHandler .setLevel (level );
96+ fileHandler .setFormatter (new oracle .kubernetes .operator .logging .OperatorLoggingFormatter ());
97+ rootLogger .addHandler (fileHandler );
98+ Logger logger = Logger .getLogger ("Operator" , "Operator" );
99+ logger .setLevel (level );
100+ logger .addHandler (consoleHandler );
101+ }
82102 }
83-
84- Logger logger = Logger .getLogger ("Operator" , "Operator" );
85- logger .setLevel (level );
86- logger .addHandler (consoleHandler );
87103 }
88104
89- } catch (IOException e ) {
90- throw new RuntimeException (e );
105+ } catch (Throwable t ) { // Catch ALL exceptions
106+ System .err .println ("FATAL: Failed to initialize logging: " + t );
107+ t .printStackTrace ();
108+ throw new RuntimeException ("Logging initialization failed" , t );
109+ }
110+ }
111+
112+ private static int getIntegerOrDefault (String val , int def ) {
113+ try {
114+ int i = Integer .parseInt (val );
115+ return i > 0 ? i : def ;
116+ } catch (NumberFormatException e ) {
117+ return def ;
91118 }
92119 }
93120
0 commit comments