Skip to content

Commit b60098b

Browse files
authored
Log NotEntitledExceptions using logger with <package> suffix (elastic#131031) (elastic#131290)
Log NotEntitledExceptions using logger with `<component>.<module>.<package>` suffix (instead of `<component>.<module>`) for more fine-grained mutes, but remaining backwards compatible regarding existing mutes. Relates to ES-12231
1 parent b8bb7bc commit b60098b

File tree

2 files changed

+39
-59
lines changed

2 files changed

+39
-59
lines changed

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyCheckerImpl.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ private void neverEntitled(Class<?> callerClass, Supplier<String> operationDescr
137137
requestingClass,
138138
operationDescription.get()
139139
),
140-
callerClass,
140+
requestingClass,
141141
entitlements
142142
);
143143
}
@@ -249,7 +249,7 @@ public void checkFileRead(Class<?> callerClass, Path path, boolean followLinks)
249249
requestingClass,
250250
realPath == null ? path : Strings.format("%s -> %s", path, realPath)
251251
),
252-
callerClass,
252+
requestingClass,
253253
entitlements
254254
);
255255
}
@@ -281,7 +281,7 @@ public void checkFileWrite(Class<?> callerClass, Path path) {
281281
requestingClass,
282282
path
283283
),
284-
callerClass,
284+
requestingClass,
285285
entitlements
286286
);
287287
}
@@ -358,8 +358,8 @@ public void checkAllNetworkAccess(Class<?> callerClass) {
358358
}
359359

360360
var classEntitlements = policyManager.getEntitlements(requestingClass);
361-
checkFlagEntitlement(classEntitlements, InboundNetworkEntitlement.class, requestingClass, callerClass);
362-
checkFlagEntitlement(classEntitlements, OutboundNetworkEntitlement.class, requestingClass, callerClass);
361+
checkFlagEntitlement(classEntitlements, InboundNetworkEntitlement.class, requestingClass);
362+
checkFlagEntitlement(classEntitlements, OutboundNetworkEntitlement.class, requestingClass);
363363
}
364364

365365
@Override
@@ -376,16 +376,15 @@ public void checkWriteProperty(Class<?> callerClass, String property) {
376376

377377
ModuleEntitlements entitlements = policyManager.getEntitlements(requestingClass);
378378
if (entitlements.getEntitlements(WriteSystemPropertiesEntitlement.class).anyMatch(e -> e.properties().contains(property))) {
379-
entitlements.logger()
380-
.debug(
381-
() -> Strings.format(
382-
"Entitled: component [%s], module [%s], class [%s], entitlement [write_system_properties], property [%s]",
383-
entitlements.componentName(),
384-
entitlements.moduleName(),
385-
requestingClass,
386-
property
387-
)
388-
);
379+
PolicyManager.generalLogger.debug(
380+
() -> Strings.format(
381+
"Entitled: component [%s], module [%s], class [%s], entitlement [write_system_properties], property [%s]",
382+
entitlements.componentName(),
383+
entitlements.moduleName(),
384+
requestingClass,
385+
property
386+
)
387+
);
389388
return;
390389
}
391390
notEntitled(
@@ -396,7 +395,7 @@ public void checkWriteProperty(Class<?> callerClass, String property) {
396395
requestingClass,
397396
property
398397
),
399-
callerClass,
398+
requestingClass,
400399
entitlements
401400
);
402401
}
@@ -437,8 +436,7 @@ Optional<StackWalker.StackFrame> findRequestingFrame(Stream<StackWalker.StackFra
437436
private void checkFlagEntitlement(
438437
ModuleEntitlements classEntitlements,
439438
Class<? extends Entitlement> entitlementClass,
440-
Class<?> requestingClass,
441-
Class<?> callerClass
439+
Class<?> requestingClass
442440
) {
443441
if (classEntitlements.hasEntitlement(entitlementClass) == false) {
444442
notEntitled(
@@ -449,27 +447,26 @@ private void checkFlagEntitlement(
449447
requestingClass,
450448
PolicyParser.buildEntitlementNameFromClass(entitlementClass)
451449
),
452-
callerClass,
450+
requestingClass,
453451
classEntitlements
454452
);
455453
}
456-
classEntitlements.logger()
457-
.debug(
458-
() -> Strings.format(
459-
"Entitled: component [%s], module [%s], class [%s], entitlement [%s]",
460-
classEntitlements.componentName(),
461-
classEntitlements.moduleName(),
462-
requestingClass,
463-
PolicyParser.buildEntitlementNameFromClass(entitlementClass)
464-
)
465-
);
454+
PolicyManager.generalLogger.debug(
455+
() -> Strings.format(
456+
"Entitled: component [%s], module [%s], class [%s], entitlement [%s]",
457+
classEntitlements.componentName(),
458+
classEntitlements.moduleName(),
459+
requestingClass,
460+
PolicyParser.buildEntitlementNameFromClass(entitlementClass)
461+
)
462+
);
466463
}
467464

468-
private void notEntitled(String message, Class<?> callerClass, ModuleEntitlements entitlements) {
465+
private void notEntitled(String message, Class<?> requestingClass, ModuleEntitlements entitlements) {
469466
var exception = new NotEntitledException(message);
470467
// Don't emit a log for suppressed packages, e.g. packages containing self tests
471-
if (suppressFailureLogPackages.contains(callerClass.getPackage()) == false) {
472-
entitlements.logger().warn("Not entitled: {}", message, exception);
468+
if (suppressFailureLogPackages.contains(requestingClass.getPackage()) == false) {
469+
entitlements.logger(requestingClass).warn("Not entitled: {}", message, exception);
473470
}
474471
throw exception;
475472
}
@@ -480,7 +477,7 @@ public void checkEntitlementPresent(Class<?> callerClass, Class<? extends Entitl
480477
if (policyManager.isTriviallyAllowed(requestingClass)) {
481478
return;
482479
}
483-
checkFlagEntitlement(policyManager.getEntitlements(requestingClass), entitlementClass, requestingClass, callerClass);
480+
checkFlagEntitlement(policyManager.getEntitlements(requestingClass), entitlementClass, requestingClass);
484481
}
485482

486483
@Override

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ protected record ModuleEntitlements(
124124
String componentName,
125125
String moduleName,
126126
Map<Class<? extends Entitlement>, List<Entitlement>> entitlementsByType,
127-
FileAccessTree fileAccess,
128-
Logger logger
127+
FileAccessTree fileAccess
129128
) {
130129

131130
public ModuleEntitlements {
@@ -143,6 +142,12 @@ public <E extends Entitlement> Stream<E> getEntitlements(Class<E> entitlementCla
143142
}
144143
return entitlements.stream().map(entitlementClass::cast);
145144
}
145+
146+
Logger logger(Class<?> requestingClass) {
147+
var packageName = requestingClass.getPackageName();
148+
var loggerSuffix = "." + componentName + "." + ((moduleName == null) ? ALL_UNNAMED : moduleName) + "." + packageName;
149+
return LogManager.getLogger(PolicyManager.class.getName() + loggerSuffix);
150+
}
146151
}
147152

148153
private FileAccessTree getDefaultFileAccess(Collection<Path> componentPaths) {
@@ -151,13 +156,7 @@ private FileAccessTree getDefaultFileAccess(Collection<Path> componentPaths) {
151156

152157
// pkg private for testing
153158
ModuleEntitlements defaultEntitlements(String componentName, Collection<Path> componentPaths, String moduleName) {
154-
return new ModuleEntitlements(
155-
componentName,
156-
moduleName,
157-
Map.of(),
158-
getDefaultFileAccess(componentPaths),
159-
getLogger(componentName, moduleName)
160-
);
159+
return new ModuleEntitlements(componentName, moduleName, Map.of(), getDefaultFileAccess(componentPaths));
161160
}
162161

163162
// pkg private for testing
@@ -177,8 +176,7 @@ ModuleEntitlements policyEntitlements(
177176
componentName,
178177
moduleName,
179178
entitlements.stream().collect(groupingBy(Entitlement::getClass)),
180-
FileAccessTree.of(componentName, moduleName, filesEntitlement, pathLookup, componentPaths, exclusivePaths),
181-
getLogger(componentName, moduleName)
179+
FileAccessTree.of(componentName, moduleName, filesEntitlement, pathLookup, componentPaths, exclusivePaths)
182180
);
183181
}
184182

@@ -288,21 +286,6 @@ private static void validateEntitlementsPerModule(
288286
}
289287
}
290288

291-
private static Logger getLogger(String componentName, String moduleName) {
292-
var loggerSuffix = "." + componentName + "." + ((moduleName == null) ? ALL_UNNAMED : moduleName);
293-
return MODULE_LOGGERS.computeIfAbsent(PolicyManager.class.getName() + loggerSuffix, LogManager::getLogger);
294-
}
295-
296-
/**
297-
* We want to use the same {@link Logger} object for a given name, because we want {@link ModuleEntitlements}
298-
* {@code equals} and {@code hashCode} to work.
299-
* <p>
300-
* This would not be required if LogManager
301-
* <a href="https://github.com/elastic/elasticsearch/issues/87511">memoized the loggers</a>,
302-
* but here we are.
303-
*/
304-
private static final ConcurrentHashMap<String, Logger> MODULE_LOGGERS = new ConcurrentHashMap<>();
305-
306289
protected ModuleEntitlements getEntitlements(Class<?> requestingClass) {
307290
return moduleEntitlementsMap.computeIfAbsent(requestingClass.getModule(), m -> computeEntitlements(requestingClass));
308291
}

0 commit comments

Comments
 (0)