Skip to content

Commit 2808f1c

Browse files
author
elasticsearchmachine
committed
Merge remote-tracking branch 'origin/main' into lucene_snapshot
2 parents 83e633e + 40dd91b commit 2808f1c

File tree

343 files changed

+3595
-1630
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

343 files changed

+3595
-1630
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/DockerBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ public enum DockerBase {
2222
// Chainguard based wolfi image with latest jdk
2323
// This is usually updated via renovatebot
2424
// spotless:off
25-
WOLFI("docker.elastic.co/wolfi/chainguard-base:latest@sha256:c4e10ecf3d8a21cf4be2fb53a2f522de50e14c80ce1da487e3ffd13f4d48d24d",
25+
WOLFI("docker.elastic.co/wolfi/chainguard-base:latest@sha256:29150cd940cc7f69407d978d5a19c86f4d9e67cf44e4d6ded787a497e8f27c9a",
2626
"-wolfi",
2727
"apk"
2828
),
29-
FIPS("docker.elastic.co/wolfi/chainguard-base-fips:sha256-ebfc3f1d7dba992231747a2e05ad1b859843e81b5e676ad342859d7cf9e425a7", "-fips", "apk"),
29+
FIPS("docker.elastic.co/wolfi/chainguard-base-fips:sha256-ebfc3f1d7dba992231747a2e05ad1b859843e81b5e676ad342859d7cf9e425a7@sha256:ebfc3f1d7dba992231747a2e05ad1b859843e81b5e676ad342859d7cf9e425a7", "-fips", "apk"),
3030
// spotless:on
3131
// Based on WOLFI above, with more extras. We don't set a base image because
3232
// we programmatically extend from the wolfi image.

build-tools-internal/version.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ protobuf = 3.25.5
3838
# test dependencies
3939
randomizedrunner = 2.8.2
4040
junit = 4.13.2
41-
junit5 = 5.7.1
42-
hamcrest = 2.1
41+
junit5 = 5.12.1
42+
hamcrest = 3.0
4343
mocksocket = 1.2
4444

4545
# test container dependencies

distribution/tools/plugin-cli/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ dependencies {
2424
compileOnly project(":libs:cli")
2525
implementation project(":libs:plugin-api")
2626
implementation project(":libs:plugin-scanner")
27-
// TODO: asm is picked up from the plugin scanner, we should consolidate so it is not defined twice
27+
implementation project(":libs:entitlement")
28+
// TODO: asm is picked up from the plugin scanner and entitlements, we should consolidate so it is not defined twice
2829
implementation 'org.ow2.asm:asm:9.7.1'
2930
implementation 'org.ow2.asm:asm-tree:9.7.1'
3031

distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
2525
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
2626
import org.elasticsearch.Build;
27-
import org.elasticsearch.bootstrap.PluginPolicyInfo;
28-
import org.elasticsearch.bootstrap.PolicyUtil;
2927
import org.elasticsearch.cli.ExitCodes;
3028
import org.elasticsearch.cli.Terminal;
3129
import org.elasticsearch.cli.UserException;
@@ -36,9 +34,9 @@
3634
import org.elasticsearch.core.PathUtils;
3735
import org.elasticsearch.core.SuppressForbidden;
3836
import org.elasticsearch.core.Tuple;
37+
import org.elasticsearch.entitlement.runtime.policy.PolicyUtils;
3938
import org.elasticsearch.env.Environment;
4039
import org.elasticsearch.jdk.JarHell;
41-
import org.elasticsearch.jdk.RuntimeVersionFeature;
4240
import org.elasticsearch.plugin.scanner.ClassReaders;
4341
import org.elasticsearch.plugin.scanner.NamedComponentScanner;
4442
import org.elasticsearch.plugins.Platforms;
@@ -934,13 +932,10 @@ private PluginDescriptor installPlugin(InstallablePlugin descriptor, Path tmpRoo
934932
);
935933
}
936934

937-
if (RuntimeVersionFeature.isSecurityManagerAvailable()) {
938-
PluginPolicyInfo pluginPolicy = PolicyUtil.getPluginPolicyInfo(tmpRoot, env.tmpDir());
939-
if (pluginPolicy != null) {
940-
Set<String> permissions = PluginSecurity.getPermissionDescriptions(pluginPolicy, env.tmpDir());
941-
PluginSecurity.confirmPolicyExceptions(terminal, permissions, batch);
942-
}
943-
}
935+
var pluginPolicy = PolicyUtils.parsePolicyIfExists(info.getName(), tmpRoot, true);
936+
937+
Set<String> entitlements = PolicyUtils.getEntitlementsDescriptions(pluginPolicy);
938+
PluginSecurity.confirmPolicyExceptions(terminal, entitlements, batch);
944939

945940
// Validate that the downloaded plugin's ID matches what we expect from the descriptor. The
946941
// exception is if we install a plugin via `InstallPluginCommand` by specifying a URL or

distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSecurity.java

Lines changed: 16 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,19 @@
99

1010
package org.elasticsearch.plugins.cli;
1111

12-
import org.elasticsearch.bootstrap.PluginPolicyInfo;
13-
import org.elasticsearch.bootstrap.PolicyUtil;
1412
import org.elasticsearch.cli.ExitCodes;
1513
import org.elasticsearch.cli.Terminal;
1614
import org.elasticsearch.cli.Terminal.Verbosity;
1715
import org.elasticsearch.cli.UserException;
1816

19-
import java.io.IOException;
20-
import java.net.URL;
21-
import java.nio.file.Path;
22-
import java.security.Permission;
23-
import java.security.UnresolvedPermission;
2417
import java.util.ArrayList;
2518
import java.util.Collections;
26-
import java.util.HashSet;
2719
import java.util.List;
2820
import java.util.Set;
2921
import java.util.stream.Collectors;
3022

3123
/**
32-
* Contains methods for displaying extended plugin permissions to the user, and confirming that
24+
* Contains methods for displaying extended plugin entitlements to the user, and confirming that
3325
* plugin installation can proceed.
3426
*/
3527
public class PluginSecurity {
@@ -40,37 +32,36 @@ public class PluginSecurity {
4032
/**
4133
* prints/confirms policy exceptions with the user
4234
*/
43-
static void confirmPolicyExceptions(Terminal terminal, Set<String> permissions, boolean batch) throws UserException {
44-
List<String> requested = new ArrayList<>(permissions);
35+
static void confirmPolicyExceptions(Terminal terminal, Set<String> entitlements, boolean batch) throws UserException {
36+
List<String> requested = new ArrayList<>(entitlements);
4537
if (requested.isEmpty()) {
46-
terminal.println(Verbosity.VERBOSE, "plugin has a policy file with no additional permissions");
38+
terminal.println(
39+
Verbosity.NORMAL,
40+
"WARNING: plugin has a policy file with no additional entitlements. Double check this is intentional."
41+
);
4742
} else {
48-
// sort permissions in a reasonable order
43+
// sort entitlements in a reasonable order
4944
Collections.sort(requested);
5045

5146
if (terminal.isHeadless()) {
5247
terminal.errorPrintln(
53-
"WARNING: plugin requires additional permissions: ["
48+
"WARNING: plugin requires additional entitlements: ["
5449
+ requested.stream().map(each -> '\'' + each + '\'').collect(Collectors.joining(", "))
5550
+ "]"
5651
);
5752
terminal.errorPrintln(
58-
"See https://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html"
59-
+ " for descriptions of what these permissions allow and the associated risks."
53+
"See " + ENTITLEMENTS_DESCRIPTION_URL + " for descriptions of what these entitlements allow and the associated risks."
6054
);
6155
} else {
6256
terminal.errorPrintln(Verbosity.NORMAL, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
63-
terminal.errorPrintln(Verbosity.NORMAL, "@ WARNING: plugin requires additional permissions @");
57+
terminal.errorPrintln(Verbosity.NORMAL, "@ WARNING: plugin requires additional entitlements @");
6458
terminal.errorPrintln(Verbosity.NORMAL, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
65-
// print all permissions:
66-
for (String permission : requested) {
67-
terminal.errorPrintln(Verbosity.NORMAL, "* " + permission);
59+
// print all entitlements:
60+
for (String entitlement : requested) {
61+
terminal.errorPrintln(Verbosity.NORMAL, "* " + entitlement);
6862
}
69-
terminal.errorPrintln(
70-
Verbosity.NORMAL,
71-
"See https://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html"
72-
);
73-
terminal.errorPrintln(Verbosity.NORMAL, "for descriptions of what these permissions allow and the associated risks.");
63+
terminal.errorPrintln(Verbosity.NORMAL, "See " + ENTITLEMENTS_DESCRIPTION_URL);
64+
terminal.errorPrintln(Verbosity.NORMAL, "for descriptions of what these entitlements allow and the associated risks.");
7465

7566
if (batch == false) {
7667
prompt(terminal);
@@ -86,53 +77,4 @@ private static void prompt(final Terminal terminal) throws UserException {
8677
throw new UserException(ExitCodes.DATA_ERROR, "installation aborted by user");
8778
}
8879
}
89-
90-
/** Format permission type, name, and actions into a string */
91-
static String formatPermission(Permission permission) {
92-
StringBuilder sb = new StringBuilder();
93-
94-
String clazz = null;
95-
if (permission instanceof UnresolvedPermission) {
96-
clazz = ((UnresolvedPermission) permission).getUnresolvedType();
97-
} else {
98-
clazz = permission.getClass().getName();
99-
}
100-
sb.append(clazz);
101-
102-
String name = null;
103-
if (permission instanceof UnresolvedPermission) {
104-
name = ((UnresolvedPermission) permission).getUnresolvedName();
105-
} else {
106-
name = permission.getName();
107-
}
108-
if (name != null && name.length() > 0) {
109-
sb.append(' ');
110-
sb.append(name);
111-
}
112-
113-
String actions = null;
114-
if (permission instanceof UnresolvedPermission) {
115-
actions = ((UnresolvedPermission) permission).getUnresolvedActions();
116-
} else {
117-
actions = permission.getActions();
118-
}
119-
if (actions != null && actions.length() > 0) {
120-
sb.append(' ');
121-
sb.append(actions);
122-
}
123-
return sb.toString();
124-
}
125-
126-
/**
127-
* Extract a unique set of permissions from the plugin's policy file. Each permission is formatted for output to users.
128-
*/
129-
public static Set<String> getPermissionDescriptions(PluginPolicyInfo pluginPolicyInfo, Path tmpDir) throws IOException {
130-
Set<Permission> allPermissions = new HashSet<>(PolicyUtil.getPolicyPermissions(null, pluginPolicyInfo.policy(), tmpDir));
131-
for (URL jar : pluginPolicyInfo.jars()) {
132-
Set<Permission> jarPermissions = PolicyUtil.getPolicyPermissions(jar, pluginPolicyInfo.policy(), tmpDir);
133-
allPermissions.addAll(jarPermissions);
134-
}
135-
136-
return allPermissions.stream().map(PluginSecurity::formatPermission).collect(Collectors.toSet());
137-
}
13880
}

distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/InstallPluginActionTests.java

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,15 @@
4141
import org.elasticsearch.common.hash.MessageDigests;
4242
import org.elasticsearch.common.io.FileSystemUtils;
4343
import org.elasticsearch.common.settings.Settings;
44+
import org.elasticsearch.core.CheckedConsumer;
4445
import org.elasticsearch.core.PathUtils;
4546
import org.elasticsearch.core.PathUtilsForTesting;
4647
import org.elasticsearch.core.Strings;
4748
import org.elasticsearch.core.SuppressForbidden;
4849
import org.elasticsearch.core.Tuple;
50+
import org.elasticsearch.entitlement.runtime.policy.PolicyUtils;
4951
import org.elasticsearch.env.Environment;
5052
import org.elasticsearch.env.TestEnvironment;
51-
import org.elasticsearch.jdk.RuntimeVersionFeature;
5253
import org.elasticsearch.plugin.scanner.NamedComponentScanner;
5354
import org.elasticsearch.plugins.Platforms;
5455
import org.elasticsearch.plugins.PluginDescriptor;
@@ -57,6 +58,8 @@
5758
import org.elasticsearch.test.PosixPermissionsResetter;
5859
import org.elasticsearch.test.compiler.InMemoryJavaCompiler;
5960
import org.elasticsearch.test.jar.JarUtils;
61+
import org.elasticsearch.xcontent.XContentBuilder;
62+
import org.elasticsearch.xcontent.yaml.YamlXContent;
6063
import org.junit.After;
6164
import org.junit.Before;
6265

@@ -102,6 +105,7 @@
102105
import java.util.zip.ZipEntry;
103106
import java.util.zip.ZipOutputStream;
104107

108+
import static org.elasticsearch.entitlement.runtime.policy.PolicyManager.ALL_UNNAMED;
105109
import static org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase.forEachFileRecursively;
106110
import static org.hamcrest.CoreMatchers.equalTo;
107111
import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -137,8 +141,6 @@ public class InstallPluginActionTests extends ESTestCase {
137141

138142
@SuppressForbidden(reason = "sets java.io.tmpdir")
139143
public InstallPluginActionTests(FileSystem fs, Function<String, Path> temp) {
140-
assert "false".equals(System.getProperty("tests.security.manager")) : "-Dtests.security.manager=false has to be set";
141-
142144
this.temp = temp;
143145
this.isPosix = fs.supportedFileAttributeViews().contains("posix");
144146
this.isReal = fs == PathUtils.getDefaultFileSystem();
@@ -309,15 +311,20 @@ private static String[] pluginProperties(String name, String[] additionalProps,
309311
).flatMap(Function.identity()).toArray(String[]::new);
310312
}
311313

312-
static void writePluginSecurityPolicy(Path pluginDir, String... permissions) throws IOException {
313-
StringBuilder securityPolicyContent = new StringBuilder("grant {\n ");
314-
for (String permission : permissions) {
315-
securityPolicyContent.append("permission java.lang.RuntimePermission \"");
316-
securityPolicyContent.append(permission);
317-
securityPolicyContent.append("\";");
314+
static void writePluginEntitlementPolicy(Path pluginDir, String moduleName, CheckedConsumer<XContentBuilder, IOException> policyBuilder)
315+
throws IOException {
316+
try (var builder = YamlXContent.contentBuilder()) {
317+
builder.startObject();
318+
builder.field(moduleName);
319+
builder.startArray();
320+
321+
policyBuilder.accept(builder);
322+
builder.endArray();
323+
builder.endObject();
324+
325+
String policy = org.elasticsearch.common.Strings.toString(builder);
326+
Files.writeString(pluginDir.resolve(PolicyUtils.POLICY_FILE_NAME), policy);
318327
}
319-
securityPolicyContent.append("\n};\n");
320-
Files.writeString(pluginDir.resolve("plugin-security.policy"), securityPolicyContent.toString());
321328
}
322329

323330
static InstallablePlugin createStablePlugin(String name, Path structure, boolean hasNamedComponentFile, String... additionalProps)
@@ -892,9 +899,8 @@ public void testInstallMisspelledOfficialPlugins() {
892899
}
893900

894901
public void testBatchFlag() throws Exception {
895-
assumeTrue("security policy validation only available with SecurityManager", RuntimeVersionFeature.isSecurityManagerAvailable());
896902
installPlugin(true);
897-
assertThat(terminal.getErrorOutput(), containsString("WARNING: plugin requires additional permissions"));
903+
assertThat(terminal.getErrorOutput(), containsString("WARNING: plugin requires additional entitlements"));
898904
assertThat(terminal.getOutput(), containsString("-> Downloading"));
899905
// No progress bar in batch mode
900906
assertThat(terminal.getOutput(), not(containsString("100%")));
@@ -942,12 +948,12 @@ public void testPluginHasDifferentNameThatDescriptor() throws Exception {
942948
assertThat(e.getMessage(), equalTo("Expected downloaded plugin to have ID [other-fake] but found [fake]"));
943949
}
944950

945-
private void installPlugin(boolean isBatch, String... additionalProperties) throws Exception {
946-
// if batch is enabled, we also want to add a security policy
951+
private void installPlugin(boolean isBatch) throws Exception {
952+
// if batch is enabled, we also want to add an entitlement policy
947953
if (isBatch) {
948-
writePluginSecurityPolicy(pluginDir, "setFactory");
954+
writePluginEntitlementPolicy(pluginDir, ALL_UNNAMED, builder -> builder.value("manage_threads"));
949955
}
950-
InstallablePlugin pluginZip = createPlugin("fake", pluginDir, additionalProperties);
956+
InstallablePlugin pluginZip = createPlugin("fake", pluginDir);
951957
skipJarHellAction.setEnvironment(env.v2());
952958
skipJarHellAction.setBatch(isBatch);
953959
skipJarHellAction.execute(List.of(pluginZip));
@@ -1531,11 +1537,13 @@ private void assertPolicyConfirmation(Tuple<Path, Environment> pathEnvironmentTu
15311537
}
15321538

15331539
public void testPolicyConfirmation() throws Exception {
1534-
assumeTrue("security policy parsing only available with SecurityManager", RuntimeVersionFeature.isSecurityManagerAvailable());
1535-
writePluginSecurityPolicy(pluginDir, "getClassLoader", "setFactory");
1540+
writePluginEntitlementPolicy(pluginDir, "test.plugin.module", builder -> {
1541+
builder.value("manage_threads");
1542+
builder.value("outbound_network");
1543+
});
15361544
InstallablePlugin pluginZip = createPluginZip("fake", pluginDir);
15371545

1538-
assertPolicyConfirmation(env, pluginZip, "plugin requires additional permissions");
1546+
assertPolicyConfirmation(env, pluginZip, "plugin requires additional entitlements");
15391547
assertPlugin("fake", pluginDir, env.v2());
15401548
}
15411549

docs/changelog/125816.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 125816
2+
summary: Use `FallbackSyntheticSourceBlockLoader` for point and `geo_point`
3+
area: Mapping
4+
type: enhancement
5+
issues: []

docs/changelog/126077.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 126077
2+
summary: Preventing `ConcurrentModificationException` when updating settings for more
3+
than one index
4+
area: Indices APIs
5+
type: bug
6+
issues: []

docs/changelog/126087.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 126087
2+
summary: Upgrade to repository-gcs to use com.google.cloud:google-cloud-storage-bom:2.50.0
3+
area: Snapshot/Restore
4+
type: upgrade
5+
issues: []

0 commit comments

Comments
 (0)