Skip to content

Commit 5aeb17d

Browse files
committed
Merge branch 'main' into fold-context-in-query-translatables
# Conflicts: # x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/EndsWith.java # x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/StartsWith.java # x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/EndsWithTests.java # x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/StartsWithTests.java
2 parents 967dfd7 + 8d11dd2 commit 5aeb17d

File tree

41 files changed

+1154
-275
lines changed

Some content is hidden

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

41 files changed

+1154
-275
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.gradle.transform;
11+
12+
import org.gradle.api.Action;
13+
import org.gradle.api.artifacts.dsl.DependencyHandler;
14+
import org.gradle.api.artifacts.transform.InputArtifact;
15+
import org.gradle.api.artifacts.transform.TransformAction;
16+
import org.gradle.api.artifacts.transform.TransformOutputs;
17+
import org.gradle.api.artifacts.transform.TransformParameters;
18+
import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
19+
import org.gradle.api.file.FileSystemLocation;
20+
import org.gradle.api.provider.Provider;
21+
import org.gradle.api.tasks.Input;
22+
23+
import java.io.BufferedOutputStream;
24+
import java.io.File;
25+
import java.io.FileOutputStream;
26+
import java.io.IOException;
27+
import java.io.Serializable;
28+
import java.io.UncheckedIOException;
29+
import java.nio.file.FileSystems;
30+
import java.nio.file.Path;
31+
import java.nio.file.PathMatcher;
32+
import java.util.ArrayList;
33+
import java.util.Enumeration;
34+
import java.util.List;
35+
import java.util.zip.ZipEntry;
36+
import java.util.zip.ZipFile;
37+
import java.util.zip.ZipOutputStream;
38+
39+
public abstract class FilteringJarTransform implements TransformAction<FilteringJarTransform.Parameters> {
40+
public static final String FILTERED_JAR_TYPE = "filtered-jar";
41+
42+
@InputArtifact
43+
public abstract Provider<FileSystemLocation> getInputArtifact();
44+
45+
@Override
46+
public void transform(TransformOutputs outputs) {
47+
File original = getInputArtifact().get().getAsFile();
48+
File transformed = outputs.file(original.getName());
49+
List<PathMatcher> excludes = createMatchers(getParameters().getExcludes());
50+
51+
try (
52+
ZipFile input = new ZipFile(original);
53+
ZipOutputStream output = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(transformed)))
54+
) {
55+
Enumeration<? extends ZipEntry> entries = input.entries();
56+
while (entries.hasMoreElements()) {
57+
ZipEntry entry = entries.nextElement();
58+
if (excludes.stream().noneMatch(e -> e.matches(Path.of(entry.getName())))) {
59+
output.putNextEntry(entry);
60+
input.getInputStream(entry).transferTo(output);
61+
output.closeEntry();
62+
}
63+
}
64+
65+
output.flush();
66+
output.finish();
67+
} catch (IOException e) {
68+
throw new UncheckedIOException("Failed to patch archive", e);
69+
}
70+
}
71+
72+
private List<PathMatcher> createMatchers(List<String> patterns) {
73+
return patterns.stream().map(p -> FileSystems.getDefault().getPathMatcher("glob:" + p)).toList();
74+
}
75+
76+
public static void registerTransform(DependencyHandler dependencyHandler, Action<Parameters> config) {
77+
dependencyHandler.registerTransform(FilteringJarTransform.class, spec -> {
78+
spec.getFrom().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE);
79+
spec.getTo().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, FILTERED_JAR_TYPE);
80+
config.execute(spec.getParameters());
81+
});
82+
}
83+
84+
public abstract static class Parameters implements TransformParameters, Serializable {
85+
private List<String> excludes = new ArrayList<>();
86+
87+
@Input
88+
public List<String> getExcludes() {
89+
return excludes;
90+
}
91+
92+
public void exclude(String exclude) {
93+
excludes.add(exclude);
94+
}
95+
}
96+
}

distribution/build.gradle

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.elasticsearch.gradle.internal.ConcatFilesTask
1515
import org.elasticsearch.gradle.internal.DependenciesInfoPlugin
1616
import org.elasticsearch.gradle.internal.NoticeTask
1717
import org.elasticsearch.gradle.internal.test.ClusterFeaturesMetadataPlugin
18+
import org.elasticsearch.gradle.transform.FilteringJarTransform
1819

1920
import java.nio.file.Files
2021
import java.nio.file.Path
@@ -261,7 +262,7 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) {
261262
* Properties to expand when copying packaging files *
262263
*****************************************************************************/
263264
configurations {
264-
['libs', 'libsVersionChecker', 'libsCliLauncher', 'libsServerCli', 'libsWindowsServiceCli', 'libsPluginCli', 'libsKeystoreCli', 'libsSecurityCli', 'libsGeoIpCli', 'libsAnsiConsole', 'libsNative', 'libsEntitlementAgent', 'libsEntitlementBridge'].each {
265+
['libs', 'libsVersionChecker', 'libsCliLauncher', 'libsServerCli', 'libsWindowsServiceCli', 'libsPluginCli', 'libsKeystoreCli', 'libsSecurityCli', 'libsGeoIpCli', 'libsAnsiConsole', 'libsNative', 'libsEntitlementAgent'].each {
265266
create(it) {
266267
canBeConsumed = false
267268
canBeResolved = true
@@ -272,12 +273,28 @@ configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) {
272273
}
273274
}
274275
}
276+
libsEntitlementBridge {
277+
canBeConsumed = false
278+
canBeResolved = true
279+
attributes {
280+
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
281+
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
282+
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
283+
attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, FilteringJarTransform.FILTERED_JAR_TYPE)
284+
}
285+
}
275286
all {
276287
resolutionStrategy.dependencySubstitution {
277288
substitute module("org.apache.logging.log4j:log4j-core") using project(":libs:log4j") because "patched to remove JndiLookup class"}
278289
}
279290
}
280291

292+
// Register artifact transform for filtering entitlements-bridge jar
293+
FilteringJarTransform.registerTransform(dependencies) { spec ->
294+
spec.exclude('module-info.class')
295+
spec.exclude('META-INF/versions/**')
296+
}
297+
281298
dependencies {
282299
libs project(':server')
283300

distribution/docker/src/docker/iron_bank/hardening_manifest.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ maintainers:
4747
- name: "Mark Vieira"
4848
4949
username: "mark-vieira"
50-
- name: "Rene Gröschke"
50+
- name: "Rene Groeschke"
5151
5252
username: "breskeby"
5353
- email: "[email protected]"

docs/changelog/122991.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 122991
2+
summary: "GCS blob store: add `OperationPurpose/Operation` stats counters"
3+
area: Snapshot/Restore
4+
type: enhancement
5+
issues: []

docs/changelog/123460.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 123460
2+
summary: "ES|QL: Support `::date` in inline cast"
3+
area: ES|QL
4+
type: enhancement
5+
issues:
6+
- 116746

docs/reference/esql/functions/kibana/inline_cast.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libs/entitlement/qa/entitlement-test-plugin/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@
1818
requires java.logging;
1919
requires java.net.http;
2020
requires jdk.net;
21+
requires java.desktop;
2122
}

libs/entitlement/qa/entitlement-test-plugin/src/main/java/org/elasticsearch/entitlement/qa/test/EntitlementTestPlugin.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,28 @@
1515
import org.elasticsearch.common.settings.IndexScopedSettings;
1616
import org.elasticsearch.common.settings.Settings;
1717
import org.elasticsearch.common.settings.SettingsFilter;
18+
import org.elasticsearch.env.Environment;
1819
import org.elasticsearch.features.NodeFeature;
1920
import org.elasticsearch.plugins.ActionPlugin;
2021
import org.elasticsearch.plugins.Plugin;
2122
import org.elasticsearch.rest.RestController;
2223
import org.elasticsearch.rest.RestHandler;
2324

25+
import java.util.Collection;
2426
import java.util.List;
2527
import java.util.function.Predicate;
2628
import java.util.function.Supplier;
2729

2830
public class EntitlementTestPlugin extends Plugin implements ActionPlugin {
31+
32+
private Environment environment;
33+
34+
@Override
35+
public Collection<?> createComponents(PluginServices services) {
36+
environment = services.environment();
37+
return super.createComponents(services);
38+
}
39+
2940
@Override
3041
public List<RestHandler> getRestHandlers(
3142
final Settings settings,
@@ -38,6 +49,6 @@ public List<RestHandler> getRestHandlers(
3849
final Supplier<DiscoveryNodes> nodesInCluster,
3950
Predicate<NodeFeature> clusterSupportsFeature
4051
) {
41-
return List.of(new RestEntitlementsCheckAction());
52+
return List.of(new RestEntitlementsCheckAction(environment));
4253
}
4354
}

libs/entitlement/qa/entitlement-test-plugin/src/main/java/org/elasticsearch/entitlement/qa/test/FileCheckActions.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.core.CheckedRunnable;
1313
import org.elasticsearch.core.SuppressForbidden;
1414
import org.elasticsearch.entitlement.qa.entitled.EntitledActions;
15+
import org.elasticsearch.env.Environment;
1516

1617
import java.io.File;
1718
import java.io.FileDescriptor;
@@ -22,9 +23,11 @@
2223
import java.io.FileWriter;
2324
import java.io.IOException;
2425
import java.io.RandomAccessFile;
26+
import java.net.URISyntaxException;
2527
import java.net.http.HttpRequest;
2628
import java.net.http.HttpResponse;
2729
import java.nio.charset.StandardCharsets;
30+
import java.nio.file.Files;
2831
import java.nio.file.Path;
2932
import java.nio.file.Paths;
3033
import java.security.GeneralSecurityException;
@@ -35,12 +38,15 @@
3538
import java.util.zip.ZipException;
3639
import java.util.zip.ZipFile;
3740

41+
import javax.imageio.stream.FileImageInputStream;
42+
3843
import static java.nio.charset.Charset.defaultCharset;
3944
import static java.nio.file.StandardOpenOption.CREATE;
4045
import static java.nio.file.StandardOpenOption.WRITE;
4146
import static java.util.zip.ZipFile.OPEN_DELETE;
4247
import static java.util.zip.ZipFile.OPEN_READ;
4348
import static org.elasticsearch.entitlement.qa.entitled.EntitledActions.createTempFileForWrite;
49+
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_ALLOWED;
4450
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_DENIED;
4551
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.PLUGINS;
4652

@@ -561,5 +567,37 @@ static void httpResponseBodySubscribersOfFile_FileOpenOptions_readOnly() {
561567
HttpResponse.BodySubscribers.ofFile(readFile(), CREATE, WRITE);
562568
}
563569

570+
@EntitlementTest(expectedAccess = ALWAYS_ALLOWED)
571+
static void readAccessConfigDirectory(Environment environment) {
572+
Files.exists(environment.configDir());
573+
}
574+
575+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
576+
static void writeAccessConfigDirectory(Environment environment) throws IOException {
577+
var file = environment.configDir().resolve("to_create");
578+
Files.createFile(file);
579+
}
580+
581+
@EntitlementTest(expectedAccess = ALWAYS_ALLOWED)
582+
static void readAccessSourcePath() throws URISyntaxException {
583+
var sourcePath = Paths.get(EntitlementTestPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI());
584+
Files.exists(sourcePath);
585+
}
586+
587+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
588+
static void writeAccessSourcePath() throws IOException, URISyntaxException {
589+
var sourcePath = Paths.get(EntitlementTestPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI());
590+
var file = sourcePath.getParent().resolve("to_create");
591+
Files.createFile(file);
592+
}
593+
594+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
595+
static void javaDesktopFileAccess() throws Exception {
596+
// Test file access from a java.desktop class. We explicitly exclude that module from the "system modules", so we expect
597+
// any sensitive operation from java.desktop to fail.
598+
var file = EntitledActions.createTempFileForRead();
599+
new FileImageInputStream(file.toFile()).close();
600+
}
601+
564602
private FileCheckActions() {}
565603
}

0 commit comments

Comments
 (0)