1212import org .elasticsearch .core .Strings ;
1313import org .elasticsearch .entitlement .runtime .policy .entitlements .Entitlement ;
1414import org .elasticsearch .entitlement .runtime .policy .entitlements .FilesEntitlement ;
15+ import org .elasticsearch .entitlement .runtime .policy .entitlements .WriteSystemPropertiesEntitlement ;
1516import org .elasticsearch .logging .LogManager ;
1617import org .elasticsearch .logging .Logger ;
1718
2930import java .util .List ;
3031import java .util .Map ;
3132import java .util .Set ;
33+ import java .util .function .Function ;
3234import java .util .stream .Collectors ;
3335import java .util .stream .Stream ;
3436
@@ -44,10 +46,10 @@ public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additi
4446 var additionalScopesMap = additionalScopes .stream ().collect (Collectors .toMap (Scope ::moduleName , Scope ::entitlements ));
4547 for (var mainScope : mainScopes ) {
4648 List <Entitlement > additionalEntitlements = additionalScopesMap .remove (mainScope .moduleName ());
47- if (additionalEntitlements != null ) {
48- result .add (new Scope (mainScope .moduleName (), mergeEntitlements (mainScope .entitlements (), additionalEntitlements )));
49- } else {
49+ if (additionalEntitlements == null ) {
5050 result .add (mainScope );
51+ } else {
52+ result .add (new Scope (mainScope .moduleName (), mergeEntitlements (mainScope .entitlements (), additionalEntitlements )));
5153 }
5254 }
5355
@@ -58,24 +60,26 @@ public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additi
5860 }
5961
6062 static List <Entitlement > mergeEntitlements (List <Entitlement > a , List <Entitlement > b ) {
61- Map <Class <? extends Entitlement >, List <Entitlement >> allEntitlements = Stream .concat (a .stream (), b .stream ())
62- .collect (Collectors .groupingBy (Entitlement ::getClass ));
63-
64- List <Entitlement > result = new ArrayList <>();
65- for (var entitlements : allEntitlements .entrySet ()) {
66- var entitlementClass = entitlements .getKey ();
67- if (entitlementClass .equals (FilesEntitlement .class )) {
68- var filesData = entitlements .getValue ().stream ().flatMap (entitlement -> {
69- FilesEntitlement filesEntitlement = (FilesEntitlement ) entitlement ;
70- return filesEntitlement .filesData ().stream ();
71- }).filter (x -> x .platform ().isCurrent ()).distinct ();
72-
73- result .add (new FilesEntitlement (filesData .toList ()));
74- } else {
75- result .add (entitlements .getValue ().get (0 ));
76- }
63+ Map <Class <? extends Entitlement >, Entitlement > entitlementMap = a .stream ()
64+ .collect (Collectors .toMap (Entitlement ::getClass , Function .identity ()));
65+
66+ for (var entitlement : b ) {
67+ entitlementMap .merge (entitlement .getClass (), entitlement , PolicyUtils ::mergeEntitlement );
7768 }
78- return result ;
69+ return entitlementMap .values ().stream ().toList ();
70+ }
71+
72+ static Entitlement mergeEntitlement (Entitlement entitlement1 , Entitlement entitlement2 ) {
73+ return switch (entitlement1 ) {
74+ case FilesEntitlement e -> new FilesEntitlement (
75+ Stream .concat (e .filesData ().stream (), ((FilesEntitlement ) entitlement2 ).filesData ().stream ()).toList ()
76+ );
77+ case WriteSystemPropertiesEntitlement e -> new WriteSystemPropertiesEntitlement (
78+ Stream .concat (e .properties ().stream (), ((WriteSystemPropertiesEntitlement ) entitlement2 ).properties ().stream ())
79+ .collect (Collectors .toUnmodifiableSet ())
80+ );
81+ default -> entitlement1 ;
82+ };
7983 }
8084
8185 public record PluginData (Path pluginPath , boolean isModular , boolean isExternalPlugin ) {
0 commit comments