From f61ff40405699b1ff7ab4219cf104d5e1d90bb22 Mon Sep 17 00:00:00 2001 From: Dmitri Bourlatchkov Date: Tue, 27 Aug 2024 14:13:12 -0400 Subject: [PATCH] review: support old `true` value for access delegation mode --- .../polaris/service/catalog/AccessDelegationMode.java | 9 +++++++++ .../service/catalog/AccessDelegationModeTest.java | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/polaris-service/src/main/java/org/apache/polaris/service/catalog/AccessDelegationMode.java b/polaris-service/src/main/java/org/apache/polaris/service/catalog/AccessDelegationMode.java index 58c9eb2b8..46c67622b 100644 --- a/polaris-service/src/main/java/org/apache/polaris/service/catalog/AccessDelegationMode.java +++ b/polaris-service/src/main/java/org/apache/polaris/service/catalog/AccessDelegationMode.java @@ -21,6 +21,7 @@ import com.google.common.base.Functions; import java.util.Arrays; import java.util.EnumSet; +import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; @@ -49,6 +50,14 @@ public static EnumSet fromProtocolValuesList(String protoc return EnumSet.noneOf(AccessDelegationMode.class); } + // Backward-compatibility case for old clients that still use the unofficial value of `true` to + // request credential vending. Note that if the client requests `true` among other values it + // will be parsed as `UNKNOWN` (by the code below this `if`) since the client submitting + // multiple access modes is expected to be aware of the Iceberg REST API spec. + if (protocolValues.trim().toLowerCase(Locale.ROOT).equals("true")) { + return EnumSet.of(VENDED_CREDENTIALS); + } + EnumSet set = EnumSet.noneOf(AccessDelegationMode.class); Arrays.stream(protocolValues.split(",")) // per Iceberg REST Catalog spec .map(String::trim) diff --git a/polaris-service/src/test/java/org/apache/polaris/service/catalog/AccessDelegationModeTest.java b/polaris-service/src/test/java/org/apache/polaris/service/catalog/AccessDelegationModeTest.java index 567d63156..367840116 100644 --- a/polaris-service/src/test/java/org/apache/polaris/service/catalog/AccessDelegationModeTest.java +++ b/polaris-service/src/test/java/org/apache/polaris/service/catalog/AccessDelegationModeTest.java @@ -56,4 +56,11 @@ void testUnknown() { assertThat(fromProtocolValuesList("abc,remote-signing")) .isEqualTo(EnumSet.of(REMOTE_SIGNING, UNKNOWN)); } + + @Test + void testLegacy() { + assertThat(fromProtocolValuesList("true")).isEqualTo(EnumSet.of(VENDED_CREDENTIALS)); + assertThat(fromProtocolValuesList("true, vended-credentials")) + .isEqualTo(EnumSet.of(UNKNOWN, VENDED_CREDENTIALS)); + } }