Skip to content

Commit 220b25c

Browse files
authored
fix: Fix broken managed identity endpoint (#1776)
- Ignore versions when the request uses the metadata port - Add new tests Updates #1773 {patch} Signed-off-by: Esta Nagy <nagyesta@gmail.com>
1 parent 8871b09 commit 220b25c

File tree

5 files changed

+91
-10
lines changed

5 files changed

+91
-10
lines changed

lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/WebConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.nagyesta.lowkeyvault;
22

3+
import com.github.nagyesta.lowkeyvault.context.OptionalQueryApiVersionResolver;
34
import org.springframework.stereotype.Component;
45
import org.springframework.web.accept.ApiVersionParser;
56
import org.springframework.web.servlet.config.annotation.ApiVersionConfigurer;
@@ -14,9 +15,10 @@ public class WebConfig implements WebMvcConfigurer {
1415

1516
@Override
1617
public void configureApiVersioning(final ApiVersionConfigurer configurer) {
17-
configurer.useQueryParam(API_VERSION_NAME)
18-
.addSupportedVersions(TOKEN_VERSION_2018_02_01, TOKEN_VERSION_2019_11_01, V_7_2, V_7_3, V_7_4, V_7_5, V_7_6)
18+
configurer.useVersionResolver(new OptionalQueryApiVersionResolver())
19+
.addSupportedVersions(V_7_2, V_7_3, V_7_4, V_7_5, V_7_6)
1920
.setDefaultVersion(V_7_6)
2021
.setVersionParser(IDENTITY_VERSION_PARSER);
2122
}
23+
2224
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.github.nagyesta.lowkeyvault.context;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import org.jspecify.annotations.Nullable;
5+
import org.springframework.web.accept.QueryApiVersionResolver;
6+
7+
import static com.github.nagyesta.lowkeyvault.model.common.ApiConstants.API_VERSION_NAME;
8+
9+
/**
10+
* Query parameter-based version resolver that ignores versioning in case of metadata requests.
11+
*/
12+
public class OptionalQueryApiVersionResolver extends QueryApiVersionResolver {
13+
14+
public OptionalQueryApiVersionResolver() {
15+
super(API_VERSION_NAME);
16+
}
17+
18+
@Override
19+
public @Nullable String resolveVersion(final HttpServletRequest request) {
20+
//ignore versioning in case of metadata requests
21+
if (!request.isSecure()) {
22+
return null;
23+
}
24+
return super.resolveVersion(request);
25+
}
26+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@NullMarked
2+
package com.github.nagyesta.lowkeyvault.context;
3+
4+
import org.jspecify.annotations.NullMarked;

lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/common/ApiConstants.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,6 @@ public final class ApiConstants {
5656
* The latest supported API version.
5757
*/
5858
public static final String LATEST = V_7_6;
59-
/**
60-
* The token API version: 2018-02-01.
61-
*/
62-
public static final String TOKEN_VERSION_2018_02_01 = "2018-02-01";
63-
/**
64-
* The token API version: 2019-11-01.
65-
*/
66-
public static final String TOKEN_VERSION_2019_11_01 = "2019-11-01";
6759
/**
6860
* API version parameter name.
6961
*/
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.github.nagyesta.lowkeyvault.context;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import org.junit.jupiter.params.ParameterizedTest;
5+
import org.junit.jupiter.params.provider.Arguments;
6+
import org.junit.jupiter.params.provider.MethodSource;
7+
8+
import java.util.stream.Stream;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertNull;
12+
import static org.mockito.Mockito.*;
13+
14+
class OptionalQueryApiVersionResolverTest {
15+
16+
public static Stream<Arguments> versionProvider() {
17+
return Stream.<Arguments>builder()
18+
.add(Arguments.of("api-version=2021-10-01", true, "2021-10-01"))
19+
.add(Arguments.of("api-version=2021-10-01", false, null))
20+
.add(Arguments.of(null, true, null))
21+
.add(Arguments.of("", true, null))
22+
.add(Arguments.of("api-version=2021-10-01&other=value", true, "2021-10-01"))
23+
.add(Arguments.of("api-version=2021-10-01&other=value", false, null))
24+
.add(Arguments.of("other=value", true, null))
25+
.add(Arguments.of("other=value", false, null))
26+
.build();
27+
}
28+
29+
@ParameterizedTest
30+
@MethodSource("versionProvider")
31+
void testResolveVersionShouldReturnVersionWhenTheRequestIsSecureAndTheParameterIsPresent(
32+
final String queryString,
33+
final boolean secure,
34+
final String expected) {
35+
// given
36+
final var underTest = new OptionalQueryApiVersionResolver();
37+
final var request = mock(HttpServletRequest.class);
38+
when(request.isSecure()).thenReturn(secure);
39+
when(request.getQueryString()).thenReturn(queryString);
40+
41+
// when
42+
final var actual = underTest.resolveVersion(request);
43+
44+
// then
45+
verify(request).isSecure();
46+
if (secure) {
47+
verify(request).getQueryString();
48+
} else {
49+
verify(request, never()).getQueryString();
50+
}
51+
if (expected == null) {
52+
assertNull(actual);
53+
} else {
54+
assertEquals(expected, actual);
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)