Skip to content

Commit c5ddb06

Browse files
authored
[Policy Store] Enforce regex requirement for policy name (#1583)
* Enforce regex requirement for policy name * enable validation in open api builder * FIx nit
1 parent 1baef0e commit c5ddb06

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

api/polaris-catalog-service/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ openApiGenerate {
9090
globalProperties.put("modelTests", "false")
9191
configOptions.put("resourceName", "catalog")
9292
configOptions.put("useTags", "true")
93-
configOptions.put("useBeanValidation", "false")
93+
configOptions.put("useBeanValidation", "true")
9494
configOptions.put("sourceFolder", "src/main/java")
9595
configOptions.put("useJakartaEe", "true")
9696
configOptions.put("generateBuilders", "true")

integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import static org.apache.polaris.service.it.env.PolarisClient.polarisClient;
2222

2323
import com.google.common.collect.ImmutableMap;
24+
import jakarta.ws.rs.client.Entity;
25+
import jakarta.ws.rs.core.Response;
2426
import java.lang.annotation.Retention;
2527
import java.lang.annotation.RetentionPolicy;
2628
import java.lang.reflect.Method;
@@ -35,6 +37,7 @@
3537
import org.apache.iceberg.catalog.Namespace;
3638
import org.apache.iceberg.catalog.TableIdentifier;
3739
import org.apache.iceberg.rest.RESTCatalog;
40+
import org.apache.iceberg.rest.RESTUtil;
3841
import org.apache.iceberg.types.Types;
3942
import org.apache.polaris.core.admin.model.AwsStorageConfigInfo;
4043
import org.apache.polaris.core.admin.model.Catalog;
@@ -60,6 +63,7 @@
6063
import org.apache.polaris.service.it.env.PolicyApi;
6164
import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension;
6265
import org.apache.polaris.service.types.ApplicablePolicy;
66+
import org.apache.polaris.service.types.CreatePolicyRequest;
6367
import org.apache.polaris.service.types.Policy;
6468
import org.apache.polaris.service.types.PolicyAttachmentTarget;
6569
import org.apache.polaris.service.types.PolicyIdentifier;
@@ -72,6 +76,8 @@
7276
import org.junit.jupiter.api.TestInfo;
7377
import org.junit.jupiter.api.extension.ExtendWith;
7478
import org.junit.jupiter.api.io.TempDir;
79+
import org.junit.jupiter.params.ParameterizedTest;
80+
import org.junit.jupiter.params.provider.ValueSource;
7581

7682
@ExtendWith(PolarisIntegrationTestExtension.class)
7783
public class PolarisPolicyServiceIntegrationTest {
@@ -260,6 +266,60 @@ public void testCreatePolicy() {
260266
policyApi.dropPolicy(currentCatalogName, NS1_P1);
261267
}
262268

269+
@ParameterizedTest
270+
@ValueSource(
271+
strings = {
272+
" invalid",
273+
"invalid ",
274+
" invalid ",
275+
"",
276+
"policy name",
277+
"policy@name",
278+
"policy#name",
279+
"policy$name",
280+
"policy!name",
281+
"policy name with space",
282+
"policy.name",
283+
"policy,name",
284+
"policy~name",
285+
"policy`name",
286+
"policy;name",
287+
"policy:name",
288+
"policy<>name",
289+
"policy[]name",
290+
"policy{}name",
291+
"policy|name",
292+
"policy\\name",
293+
"policy/name",
294+
"policy*name",
295+
"policy^name",
296+
"policy%name",
297+
})
298+
public void testCreatePolicyWithInvalidName(String policyName) {
299+
restCatalog.createNamespace(NS1);
300+
PolicyIdentifier policyIdentifier = new PolicyIdentifier(NS1, policyName);
301+
302+
String ns = RESTUtil.encodeNamespace(policyIdentifier.getNamespace());
303+
CreatePolicyRequest request =
304+
CreatePolicyRequest.builder()
305+
.setType(PredefinedPolicyTypes.DATA_COMPACTION.getName())
306+
.setName(policyIdentifier.getName())
307+
.setDescription("test policy")
308+
.setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT)
309+
.build();
310+
try (Response res =
311+
policyApi
312+
.request(
313+
"polaris/v1/{cat}/namespaces/{ns}/policies",
314+
Map.of("cat", currentCatalogName, "ns", ns))
315+
.post(Entity.json(request))) {
316+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.BAD_REQUEST.getStatusCode());
317+
Assertions.assertThat(res.readEntity(String.class))
318+
.contains(
319+
"{\"error\":{\"message\":\"Invalid value: createPolicy.arg2.name: must match \\\"^[A-Za-z0-9\\\\-_]+$\\\"\",\"type\":\"ResteasyReactiveViolationException\",\"code\":400}}");
320+
}
321+
}
322+
263323
@Test
264324
public void testDropPolicy() {
265325
restCatalog.createNamespace(NS1);

0 commit comments

Comments
 (0)