Skip to content

Commit 5f376e6

Browse files
authored
Building scope -> entitlements map during PolicyManager initialization (#118070) (#118528)
1 parent 570d78c commit 5f376e6

File tree

1 file changed

+22
-25
lines changed
  • libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy

1 file changed

+22
-25
lines changed

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

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.lang.module.ModuleFinder;
1919
import java.lang.module.ModuleReference;
2020
import java.util.ArrayList;
21-
import java.util.Collections;
2221
import java.util.HashMap;
2322
import java.util.IdentityHashMap;
2423
import java.util.List;
@@ -56,8 +55,8 @@ public <E extends Entitlement> Stream<E> getEntitlements(Class<E> entitlementCla
5655

5756
final Map<Module, ModuleEntitlements> moduleEntitlementsMap = new HashMap<>();
5857

59-
protected final Policy serverPolicy;
60-
protected final Map<String, Policy> pluginPolicies;
58+
protected final Map<String, List<Entitlement>> serverEntitlements;
59+
protected final Map<String, Map<String, List<Entitlement>>> pluginsEntitlements;
6160
private final Function<Class<?>, String> pluginResolver;
6261

6362
public static final String ALL_UNNAMED = "ALL-UNNAMED";
@@ -79,19 +78,16 @@ private static Set<Module> findSystemModules() {
7978
}
8079

8180
public PolicyManager(Policy defaultPolicy, Map<String, Policy> pluginPolicies, Function<Class<?>, String> pluginResolver) {
82-
this.serverPolicy = Objects.requireNonNull(defaultPolicy);
83-
this.pluginPolicies = Collections.unmodifiableMap(Objects.requireNonNull(pluginPolicies));
81+
this.serverEntitlements = buildScopeEntitlementsMap(Objects.requireNonNull(defaultPolicy));
82+
this.pluginsEntitlements = Objects.requireNonNull(pluginPolicies)
83+
.entrySet()
84+
.stream()
85+
.collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, e -> buildScopeEntitlementsMap(e.getValue())));
8486
this.pluginResolver = pluginResolver;
8587
}
8688

87-
private static List<Entitlement> lookupEntitlementsForModule(Policy policy, String moduleName) {
88-
for (int i = 0; i < policy.scopes.size(); ++i) {
89-
var scope = policy.scopes.get(i);
90-
if (scope.name.equals(moduleName)) {
91-
return scope.entitlements;
92-
}
93-
}
94-
return null;
89+
private static Map<String, List<Entitlement>> buildScopeEntitlementsMap(Policy policy) {
90+
return policy.scopes.stream().collect(Collectors.toUnmodifiableMap(scope -> scope.name, scope -> scope.entitlements));
9591
}
9692

9793
public void checkExitVM(Class<?> callerClass) {
@@ -141,21 +137,21 @@ ModuleEntitlements getEntitlementsOrThrow(Class<?> callerClass, Module requestin
141137

142138
if (isServerModule(requestingModule)) {
143139
var scopeName = requestingModule.getName();
144-
return getModuleEntitlementsOrThrow(callerClass, requestingModule, serverPolicy, scopeName);
140+
return getModuleEntitlementsOrThrow(callerClass, requestingModule, serverEntitlements, scopeName);
145141
}
146142

147143
// plugins
148144
var pluginName = pluginResolver.apply(callerClass);
149145
if (pluginName != null) {
150-
var pluginPolicy = pluginPolicies.get(pluginName);
151-
if (pluginPolicy != null) {
146+
var pluginEntitlements = pluginsEntitlements.get(pluginName);
147+
if (pluginEntitlements != null) {
152148
final String scopeName;
153149
if (requestingModule.isNamed() == false) {
154150
scopeName = ALL_UNNAMED;
155151
} else {
156152
scopeName = requestingModule.getName();
157153
}
158-
return getModuleEntitlementsOrThrow(callerClass, requestingModule, pluginPolicy, scopeName);
154+
return getModuleEntitlementsOrThrow(callerClass, requestingModule, pluginEntitlements, scopeName);
159155
}
160156
}
161157

@@ -167,15 +163,20 @@ private static String buildModuleNoPolicyMessage(Class<?> callerClass, Module re
167163
return Strings.format("Missing entitlement policy: caller [%s], module [%s]", callerClass, requestingModule.getName());
168164
}
169165

170-
private ModuleEntitlements getModuleEntitlementsOrThrow(Class<?> callerClass, Module module, Policy policy, String moduleName) {
171-
var entitlements = lookupEntitlementsForModule(policy, moduleName);
166+
private ModuleEntitlements getModuleEntitlementsOrThrow(
167+
Class<?> callerClass,
168+
Module module,
169+
Map<String, List<Entitlement>> scopeEntitlements,
170+
String moduleName
171+
) {
172+
var entitlements = scopeEntitlements.get(moduleName);
172173
if (entitlements == null) {
173174
// Module without entitlements - remember we don't have any
174175
moduleEntitlementsMap.put(module, ModuleEntitlements.NONE);
175176
throw new NotEntitledException(buildModuleNoPolicyMessage(callerClass, module));
176177
}
177178
// We have a policy for this module
178-
var classEntitlements = createClassEntitlements(entitlements);
179+
var classEntitlements = new ModuleEntitlements(entitlements);
179180
moduleEntitlementsMap.put(module, classEntitlements);
180181
return classEntitlements;
181182
}
@@ -184,10 +185,6 @@ private static boolean isServerModule(Module requestingModule) {
184185
return requestingModule.isNamed() && requestingModule.getLayer() == ModuleLayer.boot();
185186
}
186187

187-
private ModuleEntitlements createClassEntitlements(List<Entitlement> entitlements) {
188-
return new ModuleEntitlements(entitlements);
189-
}
190-
191188
private static Module requestingModule(Class<?> callerClass) {
192189
if (callerClass != null) {
193190
Module callerModule = callerClass.getModule();
@@ -222,6 +219,6 @@ private static boolean isTriviallyAllowed(Module requestingModule) {
222219

223220
@Override
224221
public String toString() {
225-
return "PolicyManager{" + "serverPolicy=" + serverPolicy + ", pluginPolicies=" + pluginPolicies + '}';
222+
return "PolicyManager{" + "serverEntitlements=" + serverEntitlements + ", pluginsEntitlements=" + pluginsEntitlements + '}';
226223
}
227224
}

0 commit comments

Comments
 (0)