Skip to content

Commit 4338981

Browse files
authored
[Entitlements] Uniform server and plugins policy patching (#125011) (#125086)
With #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 b015b62 commit 4338981

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
@@ -80,8 +80,8 @@
8080
*/
8181
class Elasticsearch {
8282

83-
private static final String PLUGIN_POLICY_OVERRIDE_PREFIX = "es.entitlements.policy.";
84-
private static final String SERVER_POLICY_OVERRIDE = "es.entitlements.server_policy";
83+
private static final String POLICY_PATCH_PREFIX = "es.entitlements.policy.";
84+
private static final String SERVER_POLICY_PATCH_NAME = POLICY_PATCH_PREFIX + "server";
8585

8686
/**
8787
* Main entry point for starting elasticsearch.
@@ -239,10 +239,10 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
239239
.map(bundle -> new PolicyUtils.PluginData(bundle.getDir(), bundle.pluginDescriptor().isModular(), true))
240240
).toList();
241241

242-
var pluginPolicyOverrides = collectPluginPolicyOverrides(modulesBundles, pluginsBundles, logger);
243-
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyOverrides, Build.current().version());
242+
var pluginPolicyPatches = collectPluginPolicyPatches(modulesBundles, pluginsBundles, logger);
243+
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyPatches, Build.current().version());
244244
var serverPolicyPatch = PolicyUtils.parseEncodedPolicyIfExists(
245-
System.getProperty(SERVER_POLICY_OVERRIDE),
245+
System.getProperty(SERVER_POLICY_PATCH_NAME),
246246
Build.current().version(),
247247
false,
248248
"server",
@@ -288,33 +288,36 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
288288
bootstrap.setPluginsLoader(pluginsLoader);
289289
}
290290

291-
private static Map<String, String> collectPluginPolicyOverrides(
291+
private static Map<String, String> collectPluginPolicyPatches(
292292
Set<PluginBundle> modulesBundles,
293293
Set<PluginBundle> pluginsBundles,
294294
Logger logger
295295
) {
296-
var policyOverrides = new HashMap<String, String>();
296+
var policyPatches = new HashMap<String, String>();
297297
var systemProperties = BootstrapInfo.getSystemProperties();
298298
systemProperties.keys().asIterator().forEachRemaining(key -> {
299299
var value = systemProperties.get(key);
300-
if (key instanceof String k && k.startsWith(PLUGIN_POLICY_OVERRIDE_PREFIX) && value instanceof String v) {
301-
policyOverrides.put(k.substring(PLUGIN_POLICY_OVERRIDE_PREFIX.length()), v);
300+
if (key instanceof String k
301+
&& value instanceof String v
302+
&& k.startsWith(POLICY_PATCH_PREFIX)
303+
&& k.equals(SERVER_POLICY_PATCH_NAME) == false) {
304+
policyPatches.put(k.substring(POLICY_PATCH_PREFIX.length()), v);
302305
}
303306
});
304307
var pluginNames = Stream.concat(modulesBundles.stream(), pluginsBundles.stream())
305308
.map(bundle -> bundle.pluginDescriptor().getName())
306309
.collect(Collectors.toUnmodifiableSet());
307310

308-
for (var overriddenPluginName : policyOverrides.keySet()) {
309-
if (pluginNames.contains(overriddenPluginName) == false) {
311+
for (var patchedPluginName : policyPatches.keySet()) {
312+
if (pluginNames.contains(patchedPluginName) == false) {
310313
logger.warn(
311-
"Found command-line override for unknown plugin [{}] (available plugins: [{}])",
312-
overriddenPluginName,
314+
"Found command-line policy patch for unknown plugin [{}] (available plugins: [{}])",
315+
patchedPluginName,
313316
String.join(", ", pluginNames)
314317
);
315318
}
316319
}
317-
return policyOverrides;
320+
return policyPatches;
318321
}
319322

320323
private static class EntitlementSelfTester {

0 commit comments

Comments
 (0)