Skip to content

Commit 4bf1995

Browse files
prdoylejdconrad
andauthored
Backport Refactor: separate package for entitlement records (#121204) (#121341)
* Add single flag entitlement validation (#121234) This adds basic flag entitlement validation when creating PolicyManager. If a module has the same flag entitlement as part of it's policy multiple times we will throw an IllegalArgumentException. With this validation we can safely assume FileEntitlement is the only one we currently have that allows multiple entitlements in a policy. * Refactor: separate package for entitlement records (#121204) * Fix PolicyManagerTests after package move (#121304) * Fix PolicyManagerTests after package move * Unmute --------- Co-authored-by: Jack Conradson <[email protected]>
1 parent 5d37833 commit 4bf1995

23 files changed

+192
-33
lines changed

libs/entitlement/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
exports org.elasticsearch.entitlement.runtime.api;
2121
exports org.elasticsearch.entitlement.runtime.policy;
22+
exports org.elasticsearch.entitlement.runtime.policy.entitlements to org.elasticsearch.server;
2223
exports org.elasticsearch.entitlement.instrumentation;
2324
exports org.elasticsearch.entitlement.bootstrap to org.elasticsearch.server;
2425
exports org.elasticsearch.entitlement.initialization to java.base;

libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
import org.elasticsearch.entitlement.instrumentation.MethodKey;
1919
import org.elasticsearch.entitlement.instrumentation.Transformer;
2020
import org.elasticsearch.entitlement.runtime.api.ElasticsearchEntitlementChecker;
21-
import org.elasticsearch.entitlement.runtime.policy.CreateClassLoaderEntitlement;
22-
import org.elasticsearch.entitlement.runtime.policy.Entitlement;
23-
import org.elasticsearch.entitlement.runtime.policy.ExitVMEntitlement;
24-
import org.elasticsearch.entitlement.runtime.policy.InboundNetworkEntitlement;
25-
import org.elasticsearch.entitlement.runtime.policy.LoadNativeLibrariesEntitlement;
26-
import org.elasticsearch.entitlement.runtime.policy.OutboundNetworkEntitlement;
2721
import org.elasticsearch.entitlement.runtime.policy.Policy;
2822
import org.elasticsearch.entitlement.runtime.policy.PolicyManager;
2923
import org.elasticsearch.entitlement.runtime.policy.Scope;
24+
import org.elasticsearch.entitlement.runtime.policy.entitlements.CreateClassLoaderEntitlement;
25+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
26+
import org.elasticsearch.entitlement.runtime.policy.entitlements.ExitVMEntitlement;
27+
import org.elasticsearch.entitlement.runtime.policy.entitlements.InboundNetworkEntitlement;
28+
import org.elasticsearch.entitlement.runtime.policy.entitlements.LoadNativeLibrariesEntitlement;
29+
import org.elasticsearch.entitlement.runtime.policy.entitlements.OutboundNetworkEntitlement;
3030

3131
import java.lang.instrument.Instrumentation;
3232
import java.lang.reflect.Constructor;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package org.elasticsearch.entitlement.runtime.policy;
1111

12+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
13+
1214
import java.lang.annotation.ElementType;
1315
import java.lang.annotation.Retention;
1416
import java.lang.annotation.RetentionPolicy;

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.elasticsearch.entitlement.runtime.policy;
1111

1212
import org.elasticsearch.core.SuppressForbidden;
13+
import org.elasticsearch.entitlement.runtime.policy.entitlements.FileEntitlement;
1314

1415
import java.io.File;
1516
import java.nio.file.Path;
@@ -18,13 +19,13 @@
1819
import java.util.List;
1920
import java.util.Objects;
2021

21-
final class FileAccessTree {
22-
static final FileAccessTree EMPTY = new FileAccessTree(List.of());
22+
public final class FileAccessTree {
23+
public static final FileAccessTree EMPTY = new FileAccessTree(List.of());
2324

2425
private final String[] readPaths;
2526
private final String[] writePaths;
2627

27-
FileAccessTree(List<FileEntitlement> fileEntitlements) {
28+
private FileAccessTree(List<FileEntitlement> fileEntitlements) {
2829
List<String> readPaths = new ArrayList<>();
2930
List<String> writePaths = new ArrayList<>();
3031
for (FileEntitlement fileEntitlement : fileEntitlements) {
@@ -42,6 +43,10 @@ final class FileAccessTree {
4243
this.writePaths = writePaths.toArray(new String[0]);
4344
}
4445

46+
public static FileAccessTree of(List<FileEntitlement> fileEntitlements) {
47+
return new FileAccessTree(fileEntitlements);
48+
}
49+
4550
boolean canRead(Path path) {
4651
return checkPath(normalize(path), readPaths);
4752
}

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@
1212
import org.elasticsearch.core.Strings;
1313
import org.elasticsearch.core.SuppressForbidden;
1414
import org.elasticsearch.entitlement.runtime.api.NotEntitledException;
15+
import org.elasticsearch.entitlement.runtime.policy.entitlements.CreateClassLoaderEntitlement;
16+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
17+
import org.elasticsearch.entitlement.runtime.policy.entitlements.ExitVMEntitlement;
18+
import org.elasticsearch.entitlement.runtime.policy.entitlements.FileEntitlement;
19+
import org.elasticsearch.entitlement.runtime.policy.entitlements.InboundNetworkEntitlement;
20+
import org.elasticsearch.entitlement.runtime.policy.entitlements.LoadNativeLibrariesEntitlement;
21+
import org.elasticsearch.entitlement.runtime.policy.entitlements.OutboundNetworkEntitlement;
22+
import org.elasticsearch.entitlement.runtime.policy.entitlements.SetHttpsConnectionPropertiesEntitlement;
23+
import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteSystemPropertiesEntitlement;
1524
import org.elasticsearch.logging.LogManager;
1625
import org.elasticsearch.logging.Logger;
1726

@@ -20,6 +29,7 @@
2029
import java.lang.module.ModuleFinder;
2130
import java.lang.module.ModuleReference;
2231
import java.nio.file.Path;
32+
import java.util.HashSet;
2333
import java.util.List;
2434
import java.util.Map;
2535
import java.util.Optional;
@@ -53,7 +63,7 @@ public static ModuleEntitlements from(List<Entitlement> entitlements) {
5363
.toList();
5464
return new ModuleEntitlements(
5565
entitlements.stream().collect(groupingBy(Entitlement::getClass)),
56-
new FileAccessTree(fileEntitlements)
66+
FileAccessTree.of(fileEntitlements)
5767
);
5868
}
5969

@@ -120,12 +130,43 @@ public PolicyManager(
120130
this.pluginResolver = pluginResolver;
121131
this.agentsPackageName = agentsPackageName;
122132
this.entitlementsModule = entitlementsModule;
133+
134+
for (var e : serverEntitlements.entrySet()) {
135+
validateEntitlementsPerModule("server", e.getKey(), e.getValue());
136+
}
137+
validateEntitlementsPerModule("agent", "unnamed", agentEntitlements);
138+
for (var p : pluginsEntitlements.entrySet()) {
139+
for (var m : p.getValue().entrySet()) {
140+
validateEntitlementsPerModule(p.getKey(), m.getKey(), m.getValue());
141+
}
142+
}
123143
}
124144

125145
private static Map<String, List<Entitlement>> buildScopeEntitlementsMap(Policy policy) {
126146
return policy.scopes().stream().collect(toUnmodifiableMap(Scope::moduleName, Scope::entitlements));
127147
}
128148

149+
private static void validateEntitlementsPerModule(String sourceName, String moduleName, List<Entitlement> entitlements) {
150+
Set<Class<? extends Entitlement>> flagEntitlements = new HashSet<>();
151+
for (var e : entitlements) {
152+
if (e instanceof FileEntitlement) {
153+
continue;
154+
}
155+
if (flagEntitlements.contains(e.getClass())) {
156+
throw new IllegalArgumentException(
157+
"["
158+
+ sourceName
159+
+ "] using module ["
160+
+ moduleName
161+
+ "] found duplicate flag entitlements ["
162+
+ e.getClass().getName()
163+
+ "]"
164+
);
165+
}
166+
flagEntitlements.add(e.getClass());
167+
}
168+
}
169+
129170
public void checkStartProcess(Class<?> callerClass) {
130171
neverEntitled(callerClass, "start process");
131172
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@
99

1010
package org.elasticsearch.entitlement.runtime.policy;
1111

12+
import org.elasticsearch.entitlement.runtime.policy.entitlements.CreateClassLoaderEntitlement;
13+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
14+
import org.elasticsearch.entitlement.runtime.policy.entitlements.FileEntitlement;
15+
import org.elasticsearch.entitlement.runtime.policy.entitlements.InboundNetworkEntitlement;
16+
import org.elasticsearch.entitlement.runtime.policy.entitlements.LoadNativeLibrariesEntitlement;
17+
import org.elasticsearch.entitlement.runtime.policy.entitlements.OutboundNetworkEntitlement;
18+
import org.elasticsearch.entitlement.runtime.policy.entitlements.SetHttpsConnectionPropertiesEntitlement;
19+
import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteSystemPropertiesEntitlement;
1220
import org.elasticsearch.xcontent.XContentLocation;
1321
import org.elasticsearch.xcontent.XContentParser;
1422
import org.elasticsearch.xcontent.XContentParserConfiguration;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
* parser is able to wrap this exception with a line/character number for
1616
* additional useful error information.
1717
*/
18-
class PolicyValidationException extends RuntimeException {
18+
public class PolicyValidationException extends RuntimeException {
1919

20-
PolicyValidationException(String message) {
20+
public PolicyValidationException(String message) {
2121
super(message);
2222
}
2323

24-
PolicyValidationException(String message, Throwable cause) {
24+
public PolicyValidationException(String message, Throwable cause) {
2525
super(message, cause);
2626
}
2727
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package org.elasticsearch.entitlement.runtime.policy;
1111

12+
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
13+
1214
import java.util.List;
1315
import java.util.Objects;
1416

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
package org.elasticsearch.entitlement.runtime.policy;
10+
package org.elasticsearch.entitlement.runtime.policy.entitlements;
11+
12+
import org.elasticsearch.entitlement.runtime.policy.ExternalEntitlement;
1113

1214
public record CreateClassLoaderEntitlement() implements Entitlement {
1315
@ExternalEntitlement

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/Entitlement.java renamed to libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/Entitlement.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
package org.elasticsearch.entitlement.runtime.policy;
10+
package org.elasticsearch.entitlement.runtime.policy.entitlements;
11+
12+
import org.elasticsearch.entitlement.runtime.policy.Policy;
1113

1214
/**
1315
* Marker interface to ensure that only {@link Entitlement} are

0 commit comments

Comments
 (0)