Skip to content

Commit d54c45f

Browse files
Add simple test for signature headers
1 parent 8c9e98e commit d54c45f

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

plugins/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3RepositoryPlugin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ public List<Setting<?>> getSettings() {
105105
S3ClientSettings.READ_TIMEOUT_SETTING,
106106
S3ClientSettings.MAX_RETRIES_SETTING,
107107
S3ClientSettings.USE_THROTTLE_RETRIES_SETTING,
108-
S3ClientSettings.USE_PATH_STYLE_ACCESS);
108+
S3ClientSettings.USE_PATH_STYLE_ACCESS,
109+
S3ClientSettings.SIGNER_OVERRIDE,
110+
S3ClientSettings.REGION);
109111
}
110112

111113
@Override

plugins/repository-s3/src/test/java/org/elasticsearch/repositories/s3/S3BlobStoreRepositoryTests.java

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.elasticsearch.snapshots.SnapshotId;
4747
import org.elasticsearch.snapshots.SnapshotsService;
4848
import org.elasticsearch.snapshots.mockstore.BlobStoreWrapper;
49+
import org.elasticsearch.test.ESIntegTestCase;
4950
import org.elasticsearch.threadpool.ThreadPool;
5051

5152
import java.io.IOException;
@@ -56,14 +57,34 @@
5657
import java.util.List;
5758
import java.util.Map;
5859

60+
import static org.hamcrest.Matchers.containsString;
5961
import static org.hamcrest.Matchers.greaterThan;
6062
import static org.hamcrest.Matchers.lessThan;
63+
import static org.hamcrest.Matchers.startsWith;
6164

6265
@SuppressForbidden(reason = "this test uses a HttpServer to emulate an S3 endpoint")
66+
// Need to set up a new cluster for each test because cluster settings use randomized authentication settings
67+
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.TEST)
6368
public class S3BlobStoreRepositoryTests extends ESMockAPIBasedRepositoryIntegTestCase {
6469

6570
private static final TimeValue TEST_COOLDOWN_PERIOD = TimeValue.timeValueSeconds(5L);
6671

72+
private String region;
73+
private String signerOverride;
74+
75+
@Override
76+
public void setUp() throws Exception {
77+
if (randomBoolean()) {
78+
region = "test-region";
79+
}
80+
if (region != null && randomBoolean()) {
81+
signerOverride = randomFrom("AWS3SignerType", "AWS4SignerType");
82+
} else if (randomBoolean()) {
83+
signerOverride = "AWS3SignerType";
84+
}
85+
super.setUp();
86+
}
87+
6788
@Override
6889
protected String repositoryType() {
6990
return S3Repository.TYPE;
@@ -99,16 +120,23 @@ protected Settings nodeSettings(int nodeOrdinal) {
99120
secureSettings.setString(S3ClientSettings.ACCESS_KEY_SETTING.getConcreteSettingForNamespace("test").getKey(), "access");
100121
secureSettings.setString(S3ClientSettings.SECRET_KEY_SETTING.getConcreteSettingForNamespace("test").getKey(), "secret");
101122

102-
return Settings.builder()
123+
final Settings.Builder builder = Settings.builder()
103124
.put(ThreadPool.ESTIMATED_TIME_INTERVAL_SETTING.getKey(), 0) // We have tests that verify an exact wait time
104125
.put(S3ClientSettings.ENDPOINT_SETTING.getConcreteSettingForNamespace("test").getKey(), httpServerUrl())
105126
// Disable chunked encoding as it simplifies a lot the request parsing on the httpServer side
106127
.put(S3ClientSettings.DISABLE_CHUNKED_ENCODING.getConcreteSettingForNamespace("test").getKey(), true)
107128
// Disable request throttling because some random values in tests might generate too many failures for the S3 client
108129
.put(S3ClientSettings.USE_THROTTLE_RETRIES_SETTING.getConcreteSettingForNamespace("test").getKey(), false)
109130
.put(super.nodeSettings(nodeOrdinal))
110-
.setSecureSettings(secureSettings)
111-
.build();
131+
.setSecureSettings(secureSettings);
132+
133+
if (signerOverride != null) {
134+
builder.put(S3ClientSettings.SIGNER_OVERRIDE.getConcreteSettingForNamespace("test").getKey(), signerOverride);
135+
}
136+
if (region != null) {
137+
builder.put(S3ClientSettings.REGION.getConcreteSettingForNamespace("test").getKey(), region);
138+
}
139+
return builder.build();
112140
}
113141

114142
public void testEnforcedCooldownPeriod() throws IOException {
@@ -190,11 +218,31 @@ void ensureMultiPartUploadSize(long blobSize) {
190218
}
191219

192220
@SuppressForbidden(reason = "this test uses a HttpHandler to emulate an S3 endpoint")
193-
private static class S3BlobStoreHttpHandler extends S3HttpHandler implements BlobStoreHttpHandler {
221+
private class S3BlobStoreHttpHandler extends S3HttpHandler implements BlobStoreHttpHandler {
194222

195223
S3BlobStoreHttpHandler(final String bucket) {
196224
super(bucket);
197225
}
226+
227+
@Override
228+
public void handle(final HttpExchange exchange) throws IOException {
229+
validateAuthHeader(exchange);
230+
super.handle(exchange);
231+
}
232+
233+
private void validateAuthHeader(HttpExchange exchange) {
234+
final String authorizationHeaderV4 = exchange.getRequestHeaders().getFirst("Authorization");
235+
final String authorizationHeaderV3 = exchange.getRequestHeaders().getFirst("X-amzn-authorization");
236+
237+
if ("AWS3SignerType".equals(signerOverride)) {
238+
assertThat(authorizationHeaderV3, startsWith("AWS3"));
239+
} else if ("AWS4SignerType".equals(signerOverride)) {
240+
assertThat(authorizationHeaderV4, containsString("aws4_request"));
241+
}
242+
if (region != null && authorizationHeaderV4 != null) {
243+
assertThat(authorizationHeaderV4, containsString("/" + region + "/s3/"));
244+
}
245+
}
198246
}
199247

200248
/**

0 commit comments

Comments
 (0)