Skip to content

Commit 42bccad

Browse files
committed
Make sure Netty4Http3ServerTransport uses configured HeaderVerifier and Decompressor instances (opensearch-project#6108)
Signed-off-by: Andriy Redko <drreta@gmail.com> (cherry picked from commit 9d1b44e) Signed-off-by: Andriy Redko <drreta@gmail.com>
1 parent d9a34d0 commit 42bccad

7 files changed

Lines changed: 300 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2626
- Fix the issue of unprocessed X-Request-Id ([#5954](https://github.com/opensearch-project/security/pull/5954))
2727
- Fix audit log `NONE` sentinel not respected for `disabled_rest_categories`, `disabled_transport_categories`, and `ignore_users` in dynamic configuration ([#6021](https://github.com/opensearch-project/security/pull/6021))
2828
- Improve DLS error message to identify undefined user attributes when query substitution fails ([#5975](https://github.com/opensearch-project/security/pull/5975))
29-
- Fix span propagation issue for tracing([#6006](https://github.com/opensearch-project/security/pull/6006))
29+
- Fix span propagation issue for tracing ([#6006](https://github.com/opensearch-project/security/pull/6006))
30+
- Make sure Netty4Http3ServerTransport uses configured HeaderVerifier and Decompressor instances ([#6121](https://github.com/opensearch-project/security/pull/6121))
3031

3132
### Refactoring
3233

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,8 @@ allprojects {
610610
integrationTestImplementation ('com.jayway.jsonpath:json-path:2.10.0') {
611611
exclude(group: 'net.minidev', module: 'json-smart')
612612
}
613+
integrationTestImplementation "io.projectreactor.netty:reactor-netty-core:${versions.reactor_netty}"
614+
integrationTestImplementation "io.projectreactor.netty:reactor-netty-http:${versions.reactor_netty}"
613615
}
614616
}
615617
}

src/integrationTest/java/org/opensearch/security/ResourceFocusedTests.java

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import java.io.ByteArrayOutputStream;
1414
import java.io.IOException;
1515
import java.nio.charset.StandardCharsets;
16+
import java.util.ArrayList;
17+
import java.util.Collection;
18+
import java.util.List;
1619
import java.util.Map;
1720
import java.util.concurrent.TimeUnit;
1821
import java.util.stream.Collectors;
@@ -31,14 +34,22 @@
3134
import org.junit.Test;
3235

3336
import org.opensearch.action.index.IndexRequest;
37+
import org.opensearch.common.collect.Tuple;
38+
import org.opensearch.common.settings.Settings;
39+
import org.opensearch.http.HttpTransportSettings;
3440
import org.opensearch.test.framework.AsyncActions;
3541
import org.opensearch.test.framework.TestSecurityConfig;
3642
import org.opensearch.test.framework.TestSecurityConfig.User;
3743
import org.opensearch.test.framework.cluster.ClusterManager;
3844
import org.opensearch.test.framework.cluster.LocalCluster;
45+
import org.opensearch.test.framework.cluster.ReactorHttpClient;
3946
import org.opensearch.test.framework.cluster.TestRestClient;
4047
import org.opensearch.transport.client.Client;
4148

49+
import io.netty.handler.codec.http.FullHttpResponse;
50+
import io.netty.handler.codec.http.HttpResponseStatus;
51+
import reactor.netty.http.HttpProtocol;
52+
4253
import static org.hamcrest.MatcherAssert.assertThat;
4354
import static org.hamcrest.Matchers.equalTo;
4455
import static org.opensearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
@@ -64,11 +75,13 @@ public class ResourceFocusedTests {
6475
)
6576
.on("*")
6677
);
78+
private static Map<String, Object> NODE_SETTINGS = Map.of(HttpTransportSettings.SETTING_HTTP_HTTP3_ENABLED.getKey(), true);
6779

6880
@ClassRule
6981
public static LocalCluster cluster = new LocalCluster.Builder().clusterManager(ClusterManager.THREE_CLUSTER_MANAGERS)
7082
.authc(AUTHC_HTTPBASIC_INTERNAL)
7183
.users(ADMIN_USER, LIMITED_USER)
84+
.nodeSettings(NODE_SETTINGS)
7285
.anonymousAuth(false)
7386
.doNotFailOnForbidden(true)
7487
.build();
@@ -86,38 +99,41 @@ public void testUnauthenticatedFewBig() {
8699
// Tweaks:
87100
final RequestBodySize size = RequestBodySize.XLarge;
88101
final String requestPath = "/*/_search";
89-
final int parrallelism = 5;
102+
final int parallelism = 5;
90103
final int totalNumberOfRequests = 100;
91104

92-
runResourceTest(size, requestPath, parrallelism, totalNumberOfRequests);
105+
runResourceTest(size, requestPath, parallelism, totalNumberOfRequests);
106+
runResourceTestWithGenericClient(size, requestPath, parallelism, totalNumberOfRequests);
93107
}
94108

95109
@Test
96110
public void testUnauthenticatedManyMedium() {
97111
// Tweaks:
98112
final RequestBodySize size = RequestBodySize.Medium;
99113
final String requestPath = "/*/_search";
100-
final int parrallelism = 20;
114+
final int parallelism = 20;
101115
final int totalNumberOfRequests = 10_000;
102116

103-
runResourceTest(size, requestPath, parrallelism, totalNumberOfRequests);
117+
runResourceTest(size, requestPath, parallelism, totalNumberOfRequests);
118+
runResourceTestWithGenericClient(size, requestPath, parallelism, totalNumberOfRequests);
104119
}
105120

106121
@Test
107122
public void testUnauthenticatedTonsSmall() {
108123
// Tweaks:
109124
final RequestBodySize size = RequestBodySize.Small;
110125
final String requestPath = "/*/_search";
111-
final int parrallelism = 100;
126+
final int parallelism = 100;
112127
final int totalNumberOfRequests = 15_000;
113128

114-
runResourceTest(size, requestPath, parrallelism, totalNumberOfRequests);
129+
runResourceTest(size, requestPath, parallelism, totalNumberOfRequests);
130+
runResourceTestWithGenericClient(size, requestPath, parallelism, totalNumberOfRequests);
115131
}
116132

117133
private void runResourceTest(
118134
final RequestBodySize size,
119135
final String requestPath,
120-
final int parrallelism,
136+
final int parallelism,
121137
final int totalNumberOfRequests
122138
) {
123139
final byte[] compressedRequestBody = createCompressedRequestBody(size);
@@ -127,14 +143,40 @@ private void runResourceTest(
127143
post.setEntity(new ByteArrayEntity(compressedRequestBody, ContentType.APPLICATION_JSON));
128144
TestRestClient.HttpResponse response = client.executeRequest(post);
129145
return response.getStatusCode();
130-
}, parrallelism, totalNumberOfRequests);
146+
}, parallelism, totalNumberOfRequests);
131147

132148
AsyncActions.getAll(requests, 2, TimeUnit.MINUTES).forEach((responseCode) -> {
133149
assertThat(responseCode, equalTo(HttpStatus.SC_UNAUTHORIZED));
134150
});
135151
}
136152
}
137153

154+
private void runResourceTestWithGenericClient(
155+
final RequestBodySize size,
156+
final String requestPath,
157+
final int parallelism,
158+
final int totalNumberOfRequests
159+
) {
160+
final byte[] compressedRequestBody = createCompressedRequestBody(size);
161+
try (
162+
final ReactorHttpClient client = cluster.getGenericClient(
163+
HttpProtocol.HTTP3,
164+
true,
165+
Settings.builder().loadFromMap(NODE_SETTINGS).build()
166+
)
167+
) {
168+
List<Tuple<String, byte[]>> requestUris = new ArrayList<>();
169+
for (int i = 0; i < totalNumberOfRequests; i++) {
170+
requestUris.add(Tuple.tuple(requestPath, compressedRequestBody));
171+
}
172+
173+
final Collection<FullHttpResponse> responses = client.post(requestUris, parallelism);
174+
responses.stream()
175+
.map(FullHttpResponse::status)
176+
.forEach(responseCode -> assertThat(responseCode, equalTo(HttpResponseStatus.UNAUTHORIZED)));
177+
}
178+
}
179+
138180
static enum RequestBodySize {
139181
Small(1),
140182
Medium(1_000),

src/integrationTest/java/org/opensearch/test/framework/cluster/OpenSearchClientProvider.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@
6565
import org.opensearch.client.RestClient;
6666
import org.opensearch.client.RestClientBuilder;
6767
import org.opensearch.client.RestHighLevelClient;
68+
import org.opensearch.common.settings.Settings;
6869
import org.opensearch.security.support.PemKeyReader;
6970
import org.opensearch.test.framework.certificate.CertificateData;
7071
import org.opensearch.test.framework.certificate.TestCertificates;
7172

73+
import reactor.netty.http.HttpProtocol;
74+
7275
import static org.opensearch.test.framework.cluster.TestRestClientConfiguration.getBasicAuthHeader;
7376

7477
/**
@@ -226,13 +229,19 @@ default TestRestClient getRestClient(CertificateData useCertificateData, Header.
226229
return getRestClient(Arrays.asList(headers), useCertificateData);
227230
}
228231

232+
/**
233+
* Returns a generic HTTP/1.1/HTTP 2.0/HTTP 3.0 client.
234+
*/
235+
default ReactorHttpClient getGenericClient(HttpProtocol protocol, boolean secure, Settings settings) {
236+
return new ReactorHttpClient(true, true, settings, getHttpAddress());
237+
}
238+
229239
default TestRestClient getRestClient(Header... headers) {
230240
return getRestClient((CertificateData) null, headers);
231241
}
232242

233243
default TestRestClient getRestClient(List<Header> headers) {
234244
return createGenericClientRestClient(new TestRestClientConfiguration().headers(headers));
235-
236245
}
237246

238247
default TestRestClient getRestClient(List<Header> headers, CertificateData useCertificateData) {

0 commit comments

Comments
 (0)