Skip to content

Commit c713cda

Browse files
committed
[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 cb72257 commit c713cda

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

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

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

244-
var pluginPolicyOverrides = collectPluginPolicyOverrides(modulesBundles, pluginsBundles, logger);
245-
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyOverrides, Build.current().version());
244+
var pluginPolicyPatches = collectPluginPolicyPatches(modulesBundles, pluginsBundles, logger);
245+
var pluginPolicies = PolicyUtils.createPluginPolicies(pluginData, pluginPolicyPatches, Build.current().version());
246246
var serverPolicyPatch = PolicyUtils.parseEncodedPolicyIfExists(
247-
System.getProperty(SERVER_POLICY_OVERRIDE),
247+
System.getProperty(SERVER_POLICY_PATCH_NAME),
248248
Build.current().version(),
249249
false,
250250
"server",
@@ -290,33 +290,36 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
290290
bootstrap.setPluginsLoader(pluginsLoader);
291291
}
292292

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

310-
for (var overriddenPluginName : policyOverrides.keySet()) {
311-
if (pluginNames.contains(overriddenPluginName) == false) {
313+
for (var patchedPluginName : policyPatches.keySet()) {
314+
if (pluginNames.contains(patchedPluginName) == false) {
312315
logger.warn(
313-
"Found command-line override for unknown plugin [{}] (available plugins: [{}])",
314-
overriddenPluginName,
316+
"Found command-line policy patch for unknown plugin [{}] (available plugins: [{}])",
317+
patchedPluginName,
315318
String.join(", ", pluginNames)
316319
);
317320
}
318321
}
319-
return policyOverrides;
322+
return policyPatches;
320323
}
321324

322325
private static class EntitlementSelfTester {

0 commit comments

Comments
 (0)