Skip to content

Commit 4d95210

Browse files
ldematteomricohenn
authored andcommitted
[Entitlements] Uniform server and plugins policy patching (elastic#125011)
With elastic#124904 we introduced server policy patching via system properties; now that we have the possibility to merge policies and scopes, it's worth applying the same mechanism to plugin policies too. This PR changes the behaviour of plugin policy overrides; now they are not replacing the policy entirely, but patch it by adding the entitlements and scopes specified in the "patch policy"
1 parent 9d5b208 commit 4d95210

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,34 @@ public record PluginData(Path pluginPath, boolean isModular, boolean isExternalP
4949

5050
private static final String POLICY_FILE_NAME = "entitlement-policy.yaml";
5151

52-
public static Map<String, Policy> createPluginPolicies(Collection<PluginData> pluginData, Map<String, String> overrides, String version)
53-
throws IOException {
52+
public static Map<String, Policy> createPluginPolicies(
53+
Collection<PluginData> pluginData,
54+
Map<String, String> pluginPolicyPatches,
55+
String version
56+
) throws IOException {
5457
Map<String, Policy> pluginPolicies = new HashMap<>(pluginData.size());
5558
for (var entry : pluginData) {
5659
Path pluginRoot = entry.pluginPath();
60+
Path policyFile = pluginRoot.resolve(POLICY_FILE_NAME);
5761
String pluginName = pluginRoot.getFileName().toString();
5862
final Set<String> moduleNames = getModuleNames(pluginRoot, entry.isModular());
5963

60-
var overriddenPolicy = parseEncodedPolicyIfExists(
61-
overrides.get(pluginName),
64+
var pluginPolicyPatch = parseEncodedPolicyIfExists(
65+
pluginPolicyPatches.get(pluginName),
6266
version,
6367
entry.isExternalPlugin(),
6468
pluginName,
6569
moduleNames
6670
);
67-
if (overriddenPolicy != null) {
68-
pluginPolicies.put(pluginName, overriddenPolicy);
69-
} else {
70-
Path policyFile = pluginRoot.resolve(POLICY_FILE_NAME);
71-
var policy = parsePolicyIfExists(pluginName, policyFile, entry.isExternalPlugin());
72-
validatePolicyScopes(pluginName, policy, moduleNames, policyFile.toString());
73-
pluginPolicies.put(pluginName, policy);
74-
}
71+
var pluginPolicy = parsePolicyIfExists(pluginName, policyFile, entry.isExternalPlugin());
72+
validatePolicyScopes(pluginName, pluginPolicy, moduleNames, policyFile.toString());
73+
74+
pluginPolicies.put(
75+
pluginName,
76+
pluginPolicyPatch == null
77+
? pluginPolicy
78+
: new Policy(pluginPolicy.name(), PolicyUtils.mergeScopes(pluginPolicy.scopes(), pluginPolicyPatch.scopes()))
79+
);
7580
}
7681
return pluginPolicies;
7782
}

server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@
8686
*/
8787
class Elasticsearch {
8888

89-
private static final String PLUGIN_POLICY_OVERRIDE_PREFIX = "es.entitlements.policy.";
90-
private static final String SERVER_POLICY_OVERRIDE = "es.entitlements.server_policy";
89+
private static final String POLICY_PATCH_PREFIX = "es.entitlements.policy.";
90+
private static final String SERVER_POLICY_PATCH_NAME = POLICY_PATCH_PREFIX + "server";
9191

9292
/**
9393
* Main entry point for starting elasticsearch.
@@ -253,10 +253,10 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
253253
.map(bundle -> new PolicyUtils.PluginData(bundle.getDir(), bundle.pluginDescriptor().isModular(), true))
254254
).toList();
255255

256-
var pluginPolicyOverrides = collectPluginPolicyOverrides(modulesBundles, pluginsBundles, logger);
257-
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyOverrides, Build.current().version());
256+
var pluginPolicyPatches = collectPluginPolicyPatches(modulesBundles, pluginsBundles, logger);
257+
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyPatches, Build.current().version());
258258
var serverPolicyPatch = PolicyUtils.parseEncodedPolicyIfExists(
259-
System.getProperty(SERVER_POLICY_OVERRIDE),
259+
System.getProperty(SERVER_POLICY_PATCH_NAME),
260260
Build.current().version(),
261261
false,
262262
"server",
@@ -331,33 +331,36 @@ private static void logSystemInfo() {
331331
}
332332
}
333333

334-
private static Map<String, String> collectPluginPolicyOverrides(
334+
private static Map<String, String> collectPluginPolicyPatches(
335335
Set<PluginBundle> modulesBundles,
336336
Set<PluginBundle> pluginsBundles,
337337
Logger logger
338338
) {
339-
var policyOverrides = new HashMap<String, String>();
339+
var policyPatches = new HashMap<String, String>();
340340
var systemProperties = BootstrapInfo.getSystemProperties();
341341
systemProperties.keys().asIterator().forEachRemaining(key -> {
342342
var value = systemProperties.get(key);
343-
if (key instanceof String k && k.startsWith(PLUGIN_POLICY_OVERRIDE_PREFIX) && value instanceof String v) {
344-
policyOverrides.put(k.substring(PLUGIN_POLICY_OVERRIDE_PREFIX.length()), v);
343+
if (key instanceof String k
344+
&& value instanceof String v
345+
&& k.startsWith(POLICY_PATCH_PREFIX)
346+
&& k.equals(SERVER_POLICY_PATCH_NAME) == false) {
347+
policyPatches.put(k.substring(POLICY_PATCH_PREFIX.length()), v);
345348
}
346349
});
347350
var pluginNames = Stream.concat(modulesBundles.stream(), pluginsBundles.stream())
348351
.map(bundle -> bundle.pluginDescriptor().getName())
349352
.collect(Collectors.toUnmodifiableSet());
350353

351-
for (var overriddenPluginName : policyOverrides.keySet()) {
352-
if (pluginNames.contains(overriddenPluginName) == false) {
354+
for (var patchedPluginName : policyPatches.keySet()) {
355+
if (pluginNames.contains(patchedPluginName) == false) {
353356
logger.warn(
354-
"Found command-line override for unknown plugin [{}] (available plugins: [{}])",
355-
overriddenPluginName,
357+
"Found command-line policy patch for unknown plugin [{}] (available plugins: [{}])",
358+
patchedPluginName,
356359
String.join(", ", pluginNames)
357360
);
358361
}
359362
}
360-
return policyOverrides;
363+
return policyPatches;
361364
}
362365

363366
private static class EntitlementSelfTester {

0 commit comments

Comments
 (0)